A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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 测试
使用不同的用户登录系统,测试细粒度权限控制效果。
预期结果:每个用户只查询自己所拥有的课程。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马