在线教育平台-day18-用户授权

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令牌,完成授权,拥有权限的方法正常执行,没有权限的方法将拒绝访问。

2 方法授权

2.1需求分析

方法授权要完成的是资源服务根据jwt令牌完成对方法的授权,具体流程如下:
1、生成Jwt令牌时在令牌中写入用户所拥有的权限
我们给每个权限起个名字,例如某个用户拥有如下权限:
course_find_list:课程查询
course_pic_list:课程图片查询
2、在资源服务方法上添加注解PreAuthorize,并指定此方法所需要的权限
例如下边是课程管理接口方法的授权配置,它就表示要执行这个方法需要拥有course_find_list权限。

@PreAuthorize("hasAuthority('course_find_list')")
@Override
public QueryResult<CourseInfo> findCourseList(@PathVariable("page") int page,@PathVariable("size") int size,CourseListRequest courseListRequest)

3、当请求有权限的方法时正常访问
4、当请求没有权限的方法时则拒绝访问

2.2 jwt令牌包含权限

修改认证服务的UserDetailServiceImpl类,下边的代码中 permissionList列表中存放了用户的权限,
并且将权限标识按照中间使用逗号分隔的语法组成一个字符串,最终提供给Spring security。

//指定用户的权限,这里暂时硬编码
List<String> permissionList = new ArrayList<>();
permissionList.add("course_get_baseinfo");
permissionList.add("course_find_pic");
//将权限串中间以逗号分隔
String permissionString = StringUtils.join(permissionList.toArray(), ",");
//String user_permission_string = "";
UserJwt userDetails = new UserJwt(username,
password,
AuthorityUtils.commaSeparatedStringToAuthorityList(permissionString));

重启认证服务工程,使用postman完成登录,从redis中找到jwt令牌。
使用jwt的测试程序查看 此令牌的内容。
在这里插入图片描述

2.3 方法授权实现

2.3.1资源服务添加授权控制

1、要想在资源服务使用方法授权,首先在资源服务配置授权控制
1)添加spring-cloud-starter-oauth2依赖。
2)拷贝授权配置类ResourceServerConfig。
3)拷贝公钥。

2.3.2方法上添加注解

通常情况下,程序员编写在资源服务的controller方法时会使用注解指定此方法的权限标识。
1、查询课程列表方法
指定查询课程列表方法需要拥有course_find_list权限。

@PreAuthorize("hasAuthority('course_find_list')")
@Override
public QueryResult<CourseInfo> findCourseList(@PathVariable("page") int page,@PathVariable("size") int size,CourseListRequest courseListRequest)

2、查看课程基本信息方法
指定查询课程基本信息方法需要拥有course_get_baseinfo权限。

@PreAuthorize("hasAuthority('course_get_baseinfo')")
@Override
public CourseBase getCourseBaseById(@PathVariable("courseId") String courseId)

3、在资源服务(这里是课程管理)的ResourceServerConfig类上添加注解,激活方法上添加授权注解

//激活方法上的PreAuthorize注解
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)

3 动态查询用户权限

3.1 需求分析

截至目前在测试授权时使用的权限数据是静态数据,正常情况的流程是:
1、管理员给用户分配权限,权限数据写到数据库中。
2、认证服务在进行用户认证时从数据库读取用户的权限数据(动态数据)
本节实现动态权限数据。

3.2 权限数据模型

3.2.1 数据模型结构

打开xc_user数据库,找到下边的表:
在这里插入图片描述
xc_user:用户表,存储了系统用户信息,用户类型包括:学生、老师、管理员等
xc_role:角色表,存储了系统的角色信息,学生、老师、教学管理员、系统管理员等。
xc_user_role:用户角色表,一个用户可拥有多个角色,一个角色可被多个用户所拥有
xc_menu:模块表,记录了菜单及菜单下的权限
xc_permission:角色权限表,一个角色可拥有多个权限,一个权限可被多个角色所拥有

3.2.2 数据模型的使用 略

3.3 用户中心查询用户权限 略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值