1. 程式人生 > 其它 >springsecurity 記住我

springsecurity 記住我

原理分析

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"/>