若依RuoYi-Vue代码学习一---若依如何基于OncePerRequestFilter【Spring Security的过滤器】验证的token与用户信息

若依RuoYi-Vue代码学习一---若依如何基于OncePerRequestFilter【Spring Security的过滤器】验证的token与用户信息,第1张

若依RuoYi-Vue代码学习一---若依如何基于OncePerRequestFilter【Spring Security的过滤器】验证的token与用户信息

文章目录
  • 一、通过token获取用户信息
  • 二、验证token过期

一、通过token获取用户信息

代码位置:com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter

直接上代码:

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
    @Autowired
    private TokenService tokenService;

    //做内部过滤
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        
        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
        {
            
            tokenService.verifyToken(loginUser);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            //上下文设置新的认证
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        }
        
        chain.doFilter(request, response);
    }
}

  • 打上断点详细看看
  • 先看看前端的请求头:Authorization就是token了
  • 断点方法getLoginUser()
    public LoginUser getLoginUser(HttpServletRequest request)
    {
        
        String token = getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            try
            {
                //从令牌中获取数据声明====解析成对象
                Claims claims = parseToken(token);
                // 解析对应的权限以及用户信息
                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                String userKey = getTokenKey(uuid);//登录用户 redis key+uuid
                LoginUser user = redisCache.getCacheObject(userKey);//获取缓存中的用户信息
                return user;
            }
            catch (Exception e)
            {
            }
        }
        return null;
    }
  • 先看看获取请求头header

  • 清空token前缀----为什么清除呢?后面会用到剩下的内容进行解析,然后去查缓存
  • 还是断点方法中,开始解析剩下的token
  • 进入解析令牌方法
  • 解析结束后的claims
  • 合成用户缓存的key,然后从redis中查出这个用户的信息

二、验证token过期

  • 验证过期verifyToken
    public void verifyToken(LoginUser loginUser)
    {
        long expireTime = loginUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
        {
            refreshToken(loginUser);
        }
    }
  • 获取过期时间expireTime
  • 刷新令牌===重新设置缓存过期时间
  • 可以看到过期时间发生了改变

剩下就是重新设置spring security的认证信息了,之前走过登录的,那些信息差别不大。

  • 之后spring security剩下的过滤器链中帮我们更新头部信息
  • 更新上下文信息

剩下也没什么了,遇到再说~~w(゚Д゚)w

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5612870.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存