用户授权
流程图:
流程说明:
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令牌,完成授权,拥有权限的方法正常执行,没有权限的方法将拒绝访问。
方法授权
1、首先需要在jwt令牌中包含权限:
在UserDetailServiceImpl类中的loadUserByUsername方法中permissions变量会存取当前登录用户的权限列表,当调用认证登录接口userlogin时候会调用该方法,通过打断点可以查询该用户所拥有的权限,权限名称如下:
course_find_list:课程查询
course_pic_list:课程图片查询
2、在方法加注解授权
要想在资源服务使用方法授权,首先在课程管理服务中配置授权控制
1)添加spring-cloud-starter-oauth2依赖。
2)拷贝授权配置类ResourceServerConfig。
3)拷贝公钥
4)在资源服务controller方法上添加注解PreAuthorize,并指定此方法所需要的权限
例如下边是课程管理接口方法的授权配置,它就表示要执行这个方法需要拥有course_find_list权限
@PreAuthorize("hasAuthority('course_find_list')") @Override public QueryResult<CourseInfo> findCourseList(@PathVariable("page") int page, @PathVariable("size") int size, CourseListRequest courseListRequest){ }
5)在ResourceServerConfig类上添加注解,激活方法上添加授权注解
//激活方法上的PreAuthorize注解
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
方法授权测试
动态查询用户权限
正常情况的流程是:
1、管理员给用户分配权限,权限数据写到数据库中。
2、认证服务在进行用户认证时从数据库读取用户的权限数据(动态数据)
打开xc_user数据库,其中有xc_user、xc_role、xc_user_role、xc_menu、xc_permission
用户和角色是多对多,用户和权限是多对多关系
什么是细粒度授权?
细粒度授权也叫数据范围授权,即不同的用户所拥有的操作权限相同,但是能够操作的数据范围是不一样的。一个 例子:用户A和用户B都是教学机构,他们都拥有“我的课程”权限,但是两个用户所查询到的数据是不一样的。
本项目有哪些细粒度授权?
比如: 我的课程,教学机构只允许查询本教学机构下的课程信息。 我的选课,学生只允许查询自己所选课。
如何实现细粒度授权?
细粒度授权涉及到不同的业务逻辑,通常在service层实现,根据不同的用户进行校验,根据不同的参数查询不同的 数据或操作不同的数据。
Feign 拦截器
微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT。
在首页登录成功后点击课程发布按钮,会调用FeignClientInterceptor拦截器类中的apply方法,在headerName变量中会带有jwt令牌。
前端传递到微服务A,微服务A再远程调用微服务B
每次调用之前携带JWT,首先通过Feign拦截器