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,通过rememberMeParameter修改默认值

<input type="checkbox" name="remember-me"/>

 

posted @ 2021-08-13 17:52  一杯水M  阅读(74)  评论(0编辑  收藏  举报