从零学习spring security(四)记住我功能

我们来看看springsecurity的记住我功能是如何实现的。
一、原理图
记住我原理图用户第一次登录的时候认证成功,将token写入数据库,同时将token写入浏览器cookie,当下一次登录请求时,带着token去数据库查找,如果找到则带着登录信息去调用userDetailService实现登录。
二、配置记住我

@Configuration
public class BrowserConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder(){

        return new BCryptPasswordEncoder();
    }

    @Autowired
    private IAuthenticationSuccessHandler authentication;

    @Autowired
    private IAuthenticationFailHandler failHandler;

    @Autowired
    private SecurityProperties securityProperties;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private MyUserDetailService userDetailsService;
    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
//        tokenRepository.setCreateTableOnStartup(true); // 第一次启动的时候数据库生成存token 的表

        return tokenRepository;
    };
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
        validateCodeFilter.setAuthenticationFailureHandler(failHandler); // 使用我们自定义的失败处理器

        http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 在UsernamePasswordAuthenticationFilter过滤器前面增加验证码过滤器
                .formLogin()
                    .loginPage("/authentication/require")
                    .loginProcessingUrl("/authentication/form")
                    .successHandler(authentication)
                    .failureHandler(failHandler)
                    .and()
                .rememberMe()
                    .tokenRepository(persistentTokenRepository()) // 设置tokenRepository
                    .tokenValiditySeconds(securityProperties.getProperties().getRememberMeSeconds()) // 设置过期时间
                    .userDetailsService(userDetailsService) // 设置登录信息
                .and()
                .authorizeRequests()
                .antMatchers("/authentication/require",
                        securityProperties.getProperties().getLoginPage(),
                        "/code/image" ).permitAll() // 不拦截/code/image
                .anyRequest()
                .authenticated()
                .and()
                .csrf().disable();
    }
}

JdbcTokenRepositoryImpl 类中有生成存放token的sql。
三、需要注意的点
1)tokenRepository.setCreateTableOnStartup(true); 第一次启动的时候生成表,如果不是第一次启动则需要注掉,不然会报错,因为数据库中已经存在这张表了。
2)页面上记住我的name必须时remember-me,不然无法实现记住我功能。

 <td colspan='2'><input name="remember-me" type="checkbox" value="true" />记住我</td>

这样就实现了记住我功能了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值