05 【若依框架解读】登录认证JWTtoken验证机制

背景

今天讲下若依框架对于登录认证方面的实现,这个方面若依做的不算太好,如果项目中想用的话需要参考其他框架的实现,做的更好一些。

我建议是前后端放在一起来看,单纯看后端会比较无趣。

后端部分

/login 接口

  • userName
  • password
  • code 验证码

前端获取上面三个要素后调用接口,整体改接口做了下面几件事情

  1. 验证用户身份(账号密码+验证码)
  2. 生成token
  3. 保存用户登录态到spring security中
安全配置:定义了基本的配置信息
framework.config.SecurityConfig

UserDetailsServiceImpl 用户验证处理类

登录接口的服务类
framework.web.service.SysLoginService

JWT拦截器,拦截令牌并校验信息
framework.security.filter.JwtAuthenticationTokenFilter

详细过程

  1. SysLoginService 中调用UserDetailsServiceImpl校验用户的密码是否匹配以及用户账户状态,校验通过后返回UserDetails实例,该实例包含了用户的基本信息和菜单权限信息
  2. 调用tokenService.createToken(loginUser)生成token

令牌生成的详细过程

  1. 生成uuid随机数,这个随机数用来做rediskey存储token
  2. 生成一个token(无时效)
  3. 拦截到的token如果距离失效在10分钟以内(可配置)就自动刷新有效期

前面提到了token本身无时效,有效期是通过redis控制的,因为jwt本身未提供刷新有效期的方法(可能是我不知道)。

以上用户调用了login接口并且获得了token

jwt令牌校验

/**
 * token过滤器 验证token有效性
 * 
 * @author sj
 */
@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);
    }
}

代码比较短,所以就直接贴出来,这段代码拦截了所有请求并且完成了令牌的校验和刷新,具体过程如下

  1. tokenService.getLoginUser(request); 从request中获取token并校验,如果校验通过就返回LoginUser对象
  2. 校验LoginUser的token,如果再刷限期内就直接刷新
  3. 将LoginUser封装到SecurityContextHolder中作为全局的用户登录状态

注:第3条有两个好处

  1. 后续拦截器发现SecurityContextHolder中保存了用户时,就直接通过校验
  2. 通过SecurityContextHolder可以快速获取当前请求的登录信息。

以上基本上已经说名了JWT校验的基本过程,忽略了很多细节,基础薄弱的同学可以需要先研究其他博客再来看这篇

getInfo 获取用户信息

  1. 用户的基本信息
  2. 用户所有的Permissions(菜单树)
  3. 用户所有的RopePersmission(roleKeys)

在这里插入图片描述

getRouters 获取前端页面路由信息

这个接口完全为前端准备,后面会专门讲述前端的权限控制
在这里插入图片描述

  • 16
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
若依框架token拦截功能是指在用户进行登录认证时,若依框架会自动生成一个token,并在后续请求中对该token进行拦截和验证。引用中提到,若依框架生成token的过程是先生成一个随机数作为redis key,然后将该随机数用于生成一个token,该token在生成后没有时效限制。当请求中包含该token时,若该token距离失效时间在10分钟以内(可配置),则若依框架会自动刷新token的有效期。 所以,若依框架token拦截功能可以帮助确保请求的有效性和安全性,防止未经授权的访问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [05若依框架解读登录认证JWTtoken验证机制](https://blog.csdn.net/kouryoushine/article/details/110780053)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [前后端如何实现登录token拦截校验详解](https://download.csdn.net/download/weixin_38558660/13617543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值