springsecurity 記住我
阿新 • • 發佈:2021-08-13
原理分析
1、使用者登入通過UsernamePasswordAuthenticationFilter認證請求處理,
2、通過RememberMeServices物件中的onLoginSuccess方法完成登入成功後的處理,
2.1、TokenRepository物件生成token字元
2.2、RememberMeServices物件的addCookie方法將生成的token字串儲存到Cookie中
2.3、token字串儲存到資料庫中
3、使用者再次訪問
4、RememberMeAuthenticationFilter過濾器中讀取Cookie中的Token字串
5、判斷讀取的Token字串和資料庫中的儲存資料是否一致,並且返回UserDetailsService
用法
cookie讀寫RememberMeAuthenticationFilter過濾器已經完成,現在就缺少資料庫儲存,資料庫相關的就需要配置資料來源
1、建立表
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、配置操作資料庫表,在SecurityConfig配置類
@Autowired DataSource dataSource;public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); //jdbcTokenRepository.setCreateTableOnStartup(true); //自動建立token相關資料表 return jdbcTokenRepository; }
3、配置記住我
//授權:針對url的設定 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated(). and(). formLogin() .and() .rememberMe() .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(60)//設定有效時長,單位:秒 .userDetailsService(userDetailsServiceImpl)
.and() .csrf().disable(); }
4、畫面設計
注意:自定義登入頁面時【記住我】的元件name屬性值是remember-me,不能改變
<input type="checkbox" name="remember-me"/>