出去面试认证鉴权:

1、背景
我进了一个小甲方公司,开发人员不多(5-10),技术比较陈旧,发现每一个项目很多同事,把上个项目的认证鉴权代码直接拷贝过来,直接沿用原来的代码。完成认证鉴权相关工作
2、分析现状
好处
代码不需要写,不需要思考,直接使用
缺点
只适用于同类型的项目,局限性很大
代码维护成本比较大,优化代码改动量比较大
复用性较差
3、设计
设计一套统用的统一认证鉴权的基础服务,公司中将来所有的项目统一走我的基础服务
认证鉴权的流程图,RBAC模型
4、编码
Security-client 的代码
5、测试
认证
鉴权
* 非法操作
ad77467ce4fa84a384b4f68fe02e2c2.png

1、常见的认证方式?

用户名&密码/手机验证码/三方认证(微信、QQ、微博等,项目中暂未启用)
认证流程如下图所示:
3ca2adfa29b4f07f32d0656ccbb3326.png

2、鉴权的流程?

16ff44806ac08229b7f20d7bc87c2f9.png
权限控制:用户是某个==角色==、或拥有某个==资源==时,才可访问系统资源我们称之为权限控制,权限控制分为下列2类型:

  • 基于角色

RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:
角色实质:一组权限集合(Set )
image.png

  • 基于资源

RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在资源表中,将资源对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问,其具体流程如下:
image.png

3、RBAC模型的几张表及关系?

image.png
通过上图,我们可以得到如下的信息:

  • 一个企业可以有多个用户
  • 一个用户可以有多个角色
  • 一个角色可以有多个资源

这个是经典的权限设计,也就是:==企业,用户、角色、资源==通过它们来完成整个权限的控制。

4、认证的完整流程?

image.png
实现流程:

  1. 用户在登录页面选择登陆方式进行登录认证
  2. 判断登陆方式(用户名+密码 , 手机号+验证码)
  3. 校验域名
  4. 判断是否通过,未通过直接终止
  5. 如果通过了,通过域名拿出商户号enterpriseId
  6. 构建Authentication类
  7. 查询用户明细信息(用户的权限,能访问的资源)
  8. 创建认证用户(认证管理器ReactiveAuthenticationManager)
  9. 校验用户密码是否正确
    1. 错误,走认证失败
      1. image.png
    2. 正确走认证成功流程
      1. image.png

认证成功

image.png
作用:

  • 查询并封装当前用户所分配的 角色列表、资源列表
  • 基于查询到的用户信息构建JWT令牌并返回给前端

  • 前端可以通过 JWT令牌 获取到当前用户的基本信息(企业号)、角色信息、资源信息

流程:

  1. 指定应答的状态 ,认证成功或者认证失败
  2. 认证成功,获得认证用户
  3. 构建userVo返回对象
  4. 处理角色构建,根据用户id查询角色列表,将角色标识存储到Set集合中
  5. 处理资源构建: 根据用户id查询权限(资源列表) , 将资源路径存储到Set集合中.
  6. 给用户指定角色 , 资源
  7. 构建JWT令牌,将令牌设置到返回给前端的vo对象中
  8. 返回最终结果

认证失败

image.png
认证失败:只需要返回错误信息即可
结果:统一返回失败信息