3.4 获取当前用户信息 3.4.1需求分析
要想实现只查询自己的课程信息则需要获取当前用户所属的企业id。
1、认证服务在用户认证通过将用户所属公司id等信息存储到jwt令牌中。
2、用户请求到达资源服务后,资源服务需要取出header中的jwt令牌,并解析出用户信息。
3.4.2 jwt令牌包括企业Id
资源服务在授权时需要用到用户所属企业ID,需要实现认证服务生成的JWT令牌中包括用户所属公司id信息。 查看认证服务UserDetailServiceImpl代码如下:
[AppleScript] 纯文本查看 复制代码 ......
//用户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等信息。
3.4.3获取当前用户 3.4.3.1 JWT解析工具类
1、在Oauth2Util工具类中,从header中取出JWT令牌,并解析JWT令牌的内容。
[AppleScript] 纯文本查看 复制代码 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对象返回。
[AppleScript] 纯文本查看 复制代码 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;
}
}
3.4.3.2 获取当前用户
修改课程管理的CourseController类,将companyId的静态数据改为动态获取:
[AppleScript] 纯文本查看 复制代码 @Override public QueryResult<CourseInfo> findCourseList(@PathVariable("page") int page, @PathVariable("size") int size,
CourseListRequest courseListRequest) {
//调用工具类取出用户信息
XcOauth2Util xcOauth2Util = new XcOauth2Util();
XcOauth2Util.UserJwt userJwt = xcOauth2Util.getUserJwtFromHeader(request);
if(userJwt == null){
ExceptionCast.cast(CommonCode.UNAUTHENTICATED);
} String companyId = userJwt.getCompanyId();
return courseService.findCourseList(companyId,page,size,courseListRequest); }
3.4.4 测试
使用不同的用户登录系统,测试细粒度权限控制效果。
预期结果:每个用户只查询自己所拥有的课程。
|