Spring Security 实战 - Remember me

有个用户初访并登录了你的网站,然而第二天又来了,却必须再次登录
于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的”旷日持久“早已超出了用户原本所需要的使用范围
这意味着,他们可以关闭浏览器,然后再关闭电脑,下周或者下个月,乃至更久以后再回来,只要这间隔时间不要太离谱,该网站总会知道谁是谁,并一如既往的为他们提供所有相同的功能和服务——与许久前他们离开的时候别无二致。

1 基本原理

  • 用户认证成功之后调用RemeberMeService根据用户名名生成Token由TokenRepository写到数据库,同时也将Token写入到浏览器的Cookie中
  • 重启服务之后,用户再次登入系统会由RememberMeAuthenticationFilter过滤,从Cookie中读取Token信息,与persistent_logins表匹配判断是否使用记住我功能
  • 最后由UserDetailsService查询用户信息

2 实现

2.1 建表

2.2 登陆页面添加记住我复选框

name须为remeber-me




2.3 配置 MerryyouSecurityConfig

3 效果


4 源码分析

4.1 首次登录

AbstractAuthenticationProcessingFilter#successfulAuthentication

protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        ...
        // 1 将已认证过的Authentication置于SecurityContext
        SecurityContextHolder.getContext().setAuthentication(authResult);
        // 2 登录成功调用rememberMeServices
        rememberMeServices.loginSuccess(request, response, authResult);

        // Fire event
        if (this.eventPublisher != null) {
            eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(
                    authResult, this.getClass()));
        }

        successHandler.onAuthenticationSuccess(request, response, authResult);
    }复制代码

AbstractRememberMeServices#loginSuccess

  • .判断是否勾选记住我


protected void onLoginSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication successfulAuthentication) {
        //#1.获取用户名
        String username = successfulAuthentication.getName();

        logger.debug("Creating new persistent login for user " + username);
        //#2.创建Token
        PersistentRememberMeToken persistentToken = new PersistentRememberMeToken(
                username, generateSeriesData(), generateTokenData(), new Date());
        try {
            //#3.存储都数据库
            tokenRepository.createNewToken(persistentToken);
            //#4.写入到浏览器的Cookie中
            addCookie(persistentToken, request, response);
        }
        catch (Exception e) {
            logger.error("Failed to save persistent token ", e);
        }
    }复制代码

转载于:https://juejin.im/post/5bf5620ef265da615876c883

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值