17-细粒度授权-获取当前用户信息

该博客介绍了如何在系统中获取当前用户信息,主要涉及JWT令牌的使用。首先,认证服务在用户认证成功后将用户信息,包括公司ID,存储到JWT令牌中。接着,资源服务解析请求头中的JWT令牌,获取用户所属企业ID,以便查询特定用户的课程信息。提供了Oauth2Util和XcOauth2Util工具类用于JWT令牌的解析和用户信息封装。
摘要由CSDN通过智能技术生成

3.4 获取当前用户信息

3.4.1需求分析

要想实现只查询自己的课程信息则需要获取当前用户所属的企业id。
1、认证服务在用户认证通过将用户所属公司id等信息存储到jwt令牌中。
2、用户请求到达资源服务后,资源服务需要取出header中的jwt令牌,并解析出用户信息。

3.4.2 jwt令牌包括企业Id

资源服务在授权时需要用到用户所属企业ID,需要实现认证服务生成的JWT令牌中包括用户所属公司id信息。
查看认证服务UserDetailServiceImpl代码如下:

......
//用户id
userDetails.setId(userext.getId());
//用户名称
userDetails.setName(userext.getName());
//用户头像
userDetails.setUserpic(userext.getUserpic());
//用户类型
userDetails.setUtype(userext.getUtype());
//用户所属企业id
userDetails.setCompanyId(userext.getCompanyId());
return userDetails;
......

在这里插入图片描述

通过上边代码的分析得知,认证服务调用XcUserExt userext = userClient.getUserext(username);获取用户信息,
将userext 中的信息存储到jwt令牌中,在userext 对象中已经包括了companyId公司ID等信息。

如果类继承的BaseController就可以拿到request
在这里插入图片描述
在这里插入图片描述

3.4.3获取当前用户

3.4.3.1 JWT解析工具类

1、在Oauth2Util工具类中,从header中取出JWT令牌,并解析JWT令牌的内容。

public class Oauth2Util {
public static Map<String,String> getJwtClaimsFromHeader(HttpServletRequest request) {
if (request == null) {
return null;
}
//取出头信息
String authorization = request.getHeader("Authorization");
if (StringUtils.isEmpty(authorization) || authorization.indexOf("Bearer") < 0) {
return null;
}
//从Bearer 后边开始取出token
String token = authorization.substring(7);
Map<String,String> map = null;
try {
//解析jwt
Jwt decode = JwtHelper.decode(token);
//得到 jwt中的用户信息
String claims = decode.getClaims();
//将jwt转为Map
map = JSON.parseObject(claims, Map.class);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}

2、在XcOauth2Util工具类中,将解析的JWT内容封装成UserJwt对象返回。

public class XcOauth2Util {
public UserJwt getUserJwtFromHeader(HttpServletRequest request){
Map<String, String> jwtClaims = Oauth2Util.getJwtClaimsFromHeader(request);
if(jwtClaims == null || StringUtils.isEmpty(jwtClaims.get("id"))){
return null;
}
UserJwt userJwt = new UserJwt();
userJwt.setId(jwtClaims.get("id"));
userJwt.setName(jwtClaims.get("name"));
userJwt.setCompanyId(jwtClaims.get("companyId"));
userJwt.setUtype(jwtClaims.get("utype"));
userJwt.setUserpic(jwtClaims.get("userpic"));
return userJwt;
}
@Data
public class UserJwt{
private String id;
private String name;
private String userpic;
private String utype;
private String companyId;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值