1. 统一权限-鉴权

鉴权: 即访问控制, 控制谁能访问哪些资源 , 已经进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的,如图:

image.png

  • 用户访问系统的资源
  • 进行身份认证,判断是否认证通过
  • 如果未通过,那么不与访问
  • 通过则 进行权限控制, 给当前用户根据权限分配资源
  • 判断用户当前访问的资源是否拥有访问权限
  • 如果没有访问权限,那么拒绝访问
  • 如果用户拥有该资源的访问权限,那么允许访问

RBAC基于资源的访问控制是以资源为中心进行访问控制 , 企业中常用的权限管理方法
实现思路:
将系统操作的每个url都配置在资源表中,将资源对应角色,将角色分配给用户,用户访问系统功能通过Filter进行过滤
过滤器获取到用户访问的url ,只要访问的url是用户分配角色中的url则放行,继续访问

具体流程:
6155c26f920403ae7d61f9c0608aa33.png
实现流程:

  1. 用户对系统资源发起访问请求
  2. 网关进行拦截url
  3. 判断拦截到的url在配置文件中是否配置(是否为匿名资源)
  4. 如果是匿名资源,那么直接放行
  5. 如果不是匿名资源,那么对用户进行身份认证拦截
  6. 判断用户是否进行身份认证(是否登录)
  7. 如果用户未登录,那么拒绝访问
  8. 用户身份认证完成,过滤器对url进行拦截
  9. 判断该资源是否是公共资源,如果是直接放行,允许访问
  10. 如果不是公共资源,那么判断用户是否拥有访问该资源的权限
  11. 如果没有权限,那么直接拒绝访问
  12. 否则,放行,允许访问

鉴权完整流程图:
image.png
详细流程:

  1. 用户对系统资源发起访问请求
  2. 网关进行拦截url
  3. 判断拦截到的url在配置文件中是否配置(是否为匿名资源)
  4. 如果是匿名资源,那么直接放行
  5. 如果不是匿名资源,那么对用户进行身份认证拦截
  6. 判断用户是否进行身份认证(是否登录)
  7. 如果用户未登录,那么拒绝访问
  8. 用户身份认证完成,过滤器对url进行拦截
  9. 对jwt令牌进行校验,如果令牌不通过,将友好的提示返回给前端
  10. 如果jwt令牌校验通过 , 那么对该用户的权限进行校验,拿到用户的权限列表
  11. 如果没有权限,那么拒绝访问,否则放行

2. 统一权限 , 类和每个类做的事

3231964a87fa233fd84443348b8f231.png

  1. ReactiveSecurityConfig:
    1. 认证和鉴权的核心配置: 基本配置 , 认证配置 , 鉴权配置, 退出登录 , 定义表单的转换器
  2. ReactiveServerAuthenticationConverter:
    1. 自定义表单转换器 , 作用: 转换前端参数 , 获取 用户名/手机号 , 密码/验证码 , 登录类型 , 站点类型
    2. 封装UsernamePasswordAuthenticationToken 实现了Authtication接口
    3. 根据前端传递的具体的[登陆类型] 选择具体的表单转换器 , 基于Spring IOC容器实现
  3. LoginConverter:
    1. 定义转换器方法实现接口
  4. MobilLoginConverter:
    1. 手机验证码登录表单转换器
  5. UsernameLoginConverter:
    1. 用户名和密码的表单转换器
  6. JwtReactiveAuthenticationManager:
    1. 认证管理器 , 获取参数 , 根据条件到数据库中查询 , 用户信息 - UserDetailService
    2. 根据登录类型校验密码/验证码 是否合法, 封装到 UsernamePasswordAuthenticationToken 中
  7. ReactiveUserDetailsServiceImpl:
    1. 根据不同的登录类型 , 查询用户信息 , 并封装到 UserAuth 中 , 继承User 实现了 UserDetail(用户名 , 密码 , 权限列表)
  8. JsonServerAuthenticationSuccessHandler:
    1. 认证成功处理器 , 获取用户信息 , 根据用户id查询角色列表Set,根据用户id查询权限列表生成JWT令牌,统一返回给前端
  9. JsonServerAuthenticationFailureHandler:
    1. 认证失败的处理器 , 给前端提供友好的提示JSON
  10. JwtReactiveAuthorizationManager:
    1. 鉴权管理器,
      1. 获取前端JWT令牌
      2. 校验解析令牌,得到权限列表
      3. 获取请求方式和请求路径
      4. 权限匹配
  11. JsonServerAccessDeniedHandler:
    1. 鉴权失败处理器,给前端提供友好的提示
  12. JsonServerAuthenticationEntryPoint:
    1. 用户未登录访问受保护资源 ,给前端提示 [先登录]
  13. JsonServerLogoutSuccessHandler:
    1. 登出处理器
  14. SecurityProperties:9
    1. 读取配置文件属性配置类: 登录地址 , 匿名资源列表(list) , 跨域配置地址列表(list)

3. 统一权限-系统配置集成及使用

具体实现步骤:

  1. 创建用户角色相关的五张表
  2. 在网关引入model-security-client的依赖
  3. 在网关配置文件中添加相关配置(匿名资源、jwt令牌、redis等)
  4. 修改对应的 ReactiveSecurityConfig 核心配置类

核心配置类ReactiveSecurityConfig 的UML图:
image.png