1. 统一权限-鉴权
鉴权: 即访问控制, 控制谁能访问哪些资源 , 已经进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的,如图:
- 用户访问系统的资源
- 进行身份认证,判断是否认证通过
- 如果未通过,那么不与访问
- 通过则 进行权限控制, 给当前用户根据权限分配资源
- 判断用户当前访问的资源是否拥有访问权限
- 如果没有访问权限,那么拒绝访问
- 如果用户拥有该资源的访问权限,那么允许访问
RBAC基于资源的访问控制是以资源为中心进行访问控制 , 企业中常用的权限管理方法
实现思路:
将系统操作的每个url都配置在资源表中,将资源对应角色,将角色分配给用户,用户访问系统功能通过Filter进行过滤
过滤器获取到用户访问的url ,只要访问的url是用户分配角色中的url则放行,继续访问
具体流程:
实现流程:
- 用户对系统资源发起访问请求
- 网关进行拦截url
- 判断拦截到的url在配置文件中是否配置(是否为匿名资源)
- 如果是匿名资源,那么直接放行
- 如果不是匿名资源,那么对用户进行身份认证拦截
- 判断用户是否进行身份认证(是否登录)
- 如果用户未登录,那么拒绝访问
- 用户身份认证完成,过滤器对url进行拦截
- 判断该资源是否是公共资源,如果是直接放行,允许访问
- 如果不是公共资源,那么判断用户是否拥有访问该资源的权限
- 如果没有权限,那么直接拒绝访问
- 否则,放行,允许访问
鉴权完整流程图:
详细流程:
- 用户对系统资源发起访问请求
- 网关进行拦截url
- 判断拦截到的url在配置文件中是否配置(是否为匿名资源)
- 如果是匿名资源,那么直接放行
- 如果不是匿名资源,那么对用户进行身份认证拦截
- 判断用户是否进行身份认证(是否登录)
- 如果用户未登录,那么拒绝访问
- 用户身份认证完成,过滤器对url进行拦截
- 对jwt令牌进行校验,如果令牌不通过,将友好的提示返回给前端
- 如果jwt令牌校验通过 , 那么对该用户的权限进行校验,拿到用户的权限列表
- 如果没有权限,那么拒绝访问,否则放行
2. 统一权限 , 类和每个类做的事
- ReactiveSecurityConfig:
- 认证和鉴权的核心配置: 基本配置 , 认证配置 , 鉴权配置, 退出登录 , 定义表单的转换器
- ReactiveServerAuthenticationConverter:
- 自定义表单转换器 , 作用: 转换前端参数 , 获取 用户名/手机号 , 密码/验证码 , 登录类型 , 站点类型
- 封装UsernamePasswordAuthenticationToken 实现了Authtication接口
- 根据前端传递的具体的[登陆类型] 选择具体的表单转换器 , 基于Spring IOC容器实现
- LoginConverter:
- 定义转换器方法实现接口
- MobilLoginConverter:
- 手机验证码登录表单转换器
- UsernameLoginConverter:
- 用户名和密码的表单转换器
- JwtReactiveAuthenticationManager:
- 认证管理器 , 获取参数 , 根据条件到数据库中查询 , 用户信息 - UserDetailService
- 根据登录类型校验密码/验证码 是否合法, 封装到 UsernamePasswordAuthenticationToken 中
- ReactiveUserDetailsServiceImpl:
- 根据不同的登录类型 , 查询用户信息 , 并封装到 UserAuth 中 , 继承User 实现了 UserDetail(用户名 , 密码 , 权限列表)
- JsonServerAuthenticationSuccessHandler:
- 认证成功处理器 , 获取用户信息 , 根据用户id查询角色列表Set,根据用户id查询权限列表生成JWT令牌,统一返回给前端
- JsonServerAuthenticationFailureHandler:
- 认证失败的处理器 , 给前端提供友好的提示JSON
- JwtReactiveAuthorizationManager:
- 鉴权管理器,
- 获取前端JWT令牌
- 校验解析令牌,得到权限列表
- 获取请求方式和请求路径
- 权限匹配
- 鉴权管理器,
- JsonServerAccessDeniedHandler:
- 鉴权失败处理器,给前端提供友好的提示
- JsonServerAuthenticationEntryPoint:
- 用户未登录访问受保护资源 ,给前端提示 [先登录]
- JsonServerLogoutSuccessHandler:
- 登出处理器
- SecurityProperties:9
- 读取配置文件属性配置类: 登录地址 , 匿名资源列表(list) , 跨域配置地址列表(list)
3. 统一权限-系统配置集成及使用
具体实现步骤:
- 创建用户角色相关的五张表
- 在网关引入model-security-client的依赖
- 在网关配置文件中添加相关配置(匿名资源、jwt令牌、redis等)
- 修改对应的 ReactiveSecurityConfig 核心配置类
核心配置类ReactiveSecurityConfig 的UML图: