SpringSecurity(七)新增記住我功能
阿新 • • 發佈:2018-12-21
記住我基本原理
使用者認證成功後呼叫RemeberMeService服務,這個服務裡有一個TokenRepository,它會生成一個Token寫入瀏覽器Cookie,同時它還會使用TokenRepository將Token和使用者名稱寫入到資料庫中。
當用戶再次訪問系統時,過濾器鏈如下所示,請求會經過RememberMeAuthenticationFilter過濾器,該過濾器會讀取cookie中的Token並將其交給RemeberMeService,TokenRepository會使用該Token去資料庫裡查是否存在,如果存在則取出使用者名稱,去除使用者名稱之後就會呼叫UserDetailsService獲取使用者資訊,然後將使用者資訊放入SecurityContext裡面,這樣就把使用者登入上去了。
實現步驟
1. 新建 persistent_logins表
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
2. 新增資料庫的相關依賴和配置
pom.xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
3. SpringSecurityConfig配置類,為了看清楚添加了哪些資訊,所以省略了其他的資訊
@Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private DataSource dataSource; @Bean public PersistentTokenRepository persistentTokenRepository() { JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); // tokenRepository.setCreateTableOnStartup(true); // create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null) return tokenRepository; } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .rememberMe() .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(24*60*60) // 過期秒數 .userDetailsService(myUserService) ; } }