springsecurity 记住我

时间:2021-08-13
本文章向大家介绍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"/>

原文地址:https://www.cnblogs.com/WarBlog/p/15138526.html