没有合适的资源?快使用搜索试试~ 我知道了~
学成在线-第18天-讲义-用户授权 v1.21
需积分: 0 1 下载量 110 浏览量
2022-08-03
17:16:24
上传
评论
收藏 899KB PDF 举报
温馨提示
试读
25页
1、用户认证通过,认证服务向浏览器cookie写入token( 身份令牌) 2、前端携带token请求用户中心服务获取jwt令牌 3、前端携带cookie中的身
资源详情
资源评论
资源推荐
学成在线
-第18天-讲义-用户授权
1
用户授权业务流程
用户授权的业务流程如下:
业务流程说明如下:
1、用户认证通过,认证服务向浏览器cookie写入token( 身份令牌)
2、前端携带token请求用户中心服务获取jwt令牌
前端获取到jwt令牌解析,并存储在sessionStorage
3、前端携带cookie中的身份令牌及jwt令牌访问资源服务
前端请求资源服务需要携带两个token,一个是cookie中的身份令牌,一个是http header中的jwt
前端请求资源服务前在http header上添加jwt请求资源
4、网关校验token的合法性
用户请求必须携带身份令牌和jwt令牌
网关校验redis中user_token的有效期,已过期则要求用户重新登录
5、资源服务校验jwt的合法性并进行授权
资源服务校验jwt令牌,完成授权,拥有权限的方法正常执行,没有权限的方法将拒绝访问。
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
2
方法授权
2.1
需求分析
方法授权要完成的是资源服务根据jwt令牌完成对方法的授权,具体流程如下:
1、生成Jwt令牌时在令牌中写入用户所拥有的权限
我们给每个权限起个名字,例如某个用户拥有如下权限:
course_find_list:课程查询
course_pic_list:课程图片查询
2、在资源服务方法上添加注解PreAuthorize,并指定此方法所需要的权限
例如下边是课程管理接口方法的授权配置,它就表示要执行这个方法需要拥有course_find_list权限。
3、当请求有权限的方法时正常访问
4、当请求没有权限的方法时则拒绝访问
2.2 jwt
令牌包含权限
修改认证服务的UserDetailServiceImpl类,下边的代码中 permissionList列表中存放了用户的权限,
并且将权限标识按照中间使用逗号分隔的语法组成一个字符串,最终提供给Spring security。
@PreAuthorize("hasAuthority('course_find_list')")
@Override
publicQueryResult<CourseInfo>findCourseList(@PathVariable("page")intpage,
@PathVariable("size")intsize,
CourseListRequestcourseListRequest)
......
//指定用户的权限,这里暂时硬编码
List<String>permissionList=newArrayList<>();
permissionList.add("course_get_baseinfo");
permissionList.add("course_find_pic");
//将权限串中间以逗号分隔
StringpermissionString=StringUtils.join(permissionList.toArray(),",");
//Stringuser_permission_string="";
UserJwtuserDetails=newUserJwt(username,
password,
AuthorityUtils.commaSeparatedStringToAuthorityList(permissionString));
//用户名称
userDetails.setName(userext.getName());
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
重启认证服务工程,使用
postman完成登录,从redis中找到jwt令牌。
使用jwt的测试程序查看 此令牌的内容。
可以看到authorities属性中为用户的权限。
2.3
方法授权实现
2.3.1资源服务添加授权控制
1、要想在资源服务使用方法授权,首先在资源服务配置授权控制
1)添加spring-cloud-starter-oauth2依赖。
2)拷贝授权配置类ResourceServerConfig。
3)拷贝公钥。
2.3.2方法上添加注解
通常情况下,程序员编写在资源服务的controller方法时会使用注解指定此方法的权限标识。
1、查询课程列表方法
指定查询课程列表方法需要拥有course_find_list权限。
2、查看课程基本信息方法
指定查询课程基本信息方法需要拥有course_get_baseinfo权限。
//用户头像
userDetails.setUserpic(userext.getUserpic());
......
{"companyId":null,"userpic":null,"user_name":"mrt","scope":["app"],"name":"教学管理
员","utype":"101002","id":"49","exp":1527202013,"authorities":
["course_find_pic","course_get_baseinfo"],"jti":"9360fa85‐c1b4‐428a‐80ec‐
b2e705a02827","client_id":"XcWebApp"}
@PreAuthorize("hasAuthority('course_find_list')")
@Override
publicQueryResult<CourseInfo>findCourseList(@PathVariable("page")intpage,
@PathVariable("size")intsize,
CourseListRequestcourseListRequest)
@PreAuthorize("hasAuthority('course_get_baseinfo')")
@Override
publicCourseBasegetCourseBaseById(@PathVariable("courseId")StringcourseId)
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
3、在资源服务(这里是课程管理)的ResourceServerConfig类上添加注解,激活方法上添加授权注解
2.4
方法授权测试
重启课程管理服务,测试上边两个方法。
使用postman测试,测试前执行登录,并且将jwt令牌添加到header。
1)Get 请求 http://www.xuecheng.com/api/course/coursebase/get/4028e581617f945f01617f9dabc40000
用户拥有
course_get_baseinfo权限,可以正常访问
2) Get请求 http://www.xuecheng.com/api/course/coursebase/list/1/2
由于用户没有查询课程列表方法的权限,所以无法正常访问,其它方法可以正常访问。
//激活方法上的PreAuthorize注解
@EnableGlobalMethodSecurity(prePostEnabled=true,securedEnabled=true)
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
控制台报错:
org.springframework.security.access.AccessDeniedException: 不允许访问
说明:如果方法上没有添加授权注解spring security将不进行授权控制,只要jwt令牌合法则可以正常访问。
3)异常处理
上边当没有权限访问时资源服务应该返回下边的错误代码:
进入资源服务(这里是课程管理),添加异常类AccessDeniedException.class与错误代码 10002 的 对应关系
再次测试,结果如下:
UNAUTHORISE(false,10002,"权限不足,无权操作!")
@ControllerAdvice
publicclassCustomExceptionCatchextendsExceptionCatch{
static{
//除了CustomException以外的异常类型及对应的错误代码在这里定义,,如果不定义则统一返回固定的错误信息
builder.put(AccessDeniedException.class,CommonCode.UNAUTHORISE);
}
}
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
剩余24页未读,继续阅读
明儿去打球
- 粉丝: 16
- 资源: 327
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0