ruoyi源码学习-4 获取用户信息
前言上期我们查看了登录时的流程,不过生成token的过程略过了。而本次需要根据token从redis中获取用户信息。所以我们先补充生成token过程,再查看获取用户信息流程。生成token简要步骤:获取随机的UUID作为tokentoken存入loginUser对象中更新loginUser对象的登录信息、令牌有效期等将loginUser存入redis中使用jwt加密token并返回// 创建令牌p
·
前言
上期我们查看了登录时的流程,不过生成token的过程略过了。而本次需要根据token从redis中获取用户信息。所以我们先补充生成token过程,再查看获取用户信息流程。
生成token
简要步骤:
- 获取随机的UUID作为token
- token存入loginUser对象中
- 更新loginUser对象的登录信息、令牌有效期等
- 将loginUser存入redis中
- 使用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获取用户信息,进一步探究。
简要步骤:
- 根据request获取令牌,并去除前端生成token时添加的前缀
- 判断token是否为空
- 使用jwt解密token,获取uuid
- 根据此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,就不再进行重复分析。
更多推荐
已为社区贡献5条内容
所有评论(0)