黑马程序员技术交流社区

标题: 【郑州校区】Java的新项目学成在线笔记-day18(九) [打印本页]

作者: 谷粒姐姐    时间: 2019-7-9 14:41
标题: 【郑州校区】Java的新项目学成在线笔记-day18(九)
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 测试
使用不同的用户登录系统,测试细粒度权限控制效果。
预期结果:每个用户只查询自己所拥有的课程。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2