前言

上期我们查看了登录时的流程,不过生成token的过程略过了。而本次需要根据token从redis中获取用户信息。所以我们先补充生成token过程,再查看获取用户信息流程。

生成token

简要步骤:

  1. 获取随机的UUID作为token
  2. token存入loginUser对象中
  3. 更新loginUser对象的登录信息、令牌有效期等
  4. 将loginUser存入redis中
  5. 使用jwt加密token并返回
// 创建令牌
public String createToken(LoginUser loginUser)
{
  // 使用性能更好的ThreadLocalRandom获取随机UUID
    String token = IdUtils.fastUUID();
    loginUser.setToken(token);
  // 设置用户代理信息
    setUserAgent(loginUser);
  // 刷新令牌有效期,并根据UUID将loginUser缓存
    refreshToken(loginUser);

    Map<String, Object> claims = new HashMap<>();
    claims.put(Constants.LOGIN_USER_KEY, token);
  // 使用jwt从数据声明生成令牌
    return createToken(claims);
}
获取用户信息

获取loginUser对象后,以此添加角色集合和权限集合。如果为管理员,则赋予其特定值,在前端接收过程中转化为全部角色和权限。

@GetMapping("getInfo")
public AjaxResult getInfo()
{
  // 获取用户身份信息
    LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
    SysUser user = loginUser.getUser();
    // 角色集合,如果为管理员添加admin角色
    Set<String> roles = permissionService.getRolePermission(user);
    // 权限集合,如果为管理员添加"*:*:*"
    Set<String> permissions = permissionService.getMenuPermission(user);
    AjaxResult ajax = AjaxResult.success();
    ajax.put("user", user);
    ajax.put("roles", roles);
    ajax.put("permissions", permissions);
    return ajax;
}

关键点在于getLoginUser获取用户信息,进一步探究。

简要步骤:

  1. 根据request获取令牌,并去除前端生成token时添加的前缀
  2. 判断token是否为空
  3. 使用jwt解密token,获取uuid
  4. 根据此uuid从redis中获取对应的LoginUser并返回
// 获取用户身份信息
public LoginUser getLoginUser(HttpServletRequest request)
{
    // 获取请求携带的令牌,并去除前端添加的token头
    String token = getToken(request);
    if (StringUtils.isNotEmpty(token))
    {
      // 调用jwt,与创建令牌相反过程,从令牌中过去数据声明
        Claims claims = parseToken(token);
        // 解析对应的权限以及用户信息
        String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
        String userKey = getTokenKey(uuid);
      // 从redis中获取用户信息
        LoginUser user = redisCache.getCacheObject(userKey);
        return user;
    }
    return null;
}
总结

从这两个过程,我们可以看出ruoyi采用jwt+redis方式进行权限认证。

获取路由表getRouters流程类似于获取用户信息getInfo,就不再进行重复分析。

Logo

快速构建 Web 应用程序

更多推荐