出去面试认证鉴权:
1、背景
我进了一个小甲方公司,开发人员不多(5-10),技术比较陈旧,发现每一个项目很多同事,把上个项目的认证鉴权代码直接拷贝过来,直接沿用原来的代码。完成认证鉴权相关工作
2、分析现状
好处
代码不需要写,不需要思考,直接使用
缺点
只适用于同类型的项目,局限性很大
代码维护成本比较大,优化代码改动量比较大
复用性较差
3、设计
设计一套统用的统一认证鉴权的基础服务,公司中将来所有的项目统一走我的基础服务
认证鉴权的流程图,RBAC模型
4、编码
Security-client 的代码
5、测试
认证
鉴权
* 非法操作
1、常见的认证方式?
用户名&密码/手机验证码/三方认证(微信、QQ、微博等,项目中暂未启用)
认证流程如下图所示:
2、鉴权的流程?
权限控制:用户是某个==角色==、或拥有某个==资源==时,才可访问系统资源我们称之为权限控制,权限控制分为下列2类型:
- 基于角色
RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:
角色实质:一组权限集合(Set )
- 基于资源
RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在资源表中,将资源对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问,其具体流程如下:
3、RBAC模型的几张表及关系?
通过上图,我们可以得到如下的信息:
- 一个企业可以有多个用户
- 一个用户可以有多个角色
- 一个角色可以有多个资源
这个是经典的权限设计,也就是:==企业,用户、角色、资源==通过它们来完成整个权限的控制。
4、认证的完整流程?
实现流程:
- 用户在登录页面选择登陆方式进行登录认证
- 判断登陆方式(用户名+密码 , 手机号+验证码)
- 校验域名
- 判断是否通过,未通过直接终止
- 如果通过了,通过域名拿出商户号enterpriseId
- 构建Authentication类
- 查询用户明细信息(用户的权限,能访问的资源)
- 创建认证用户(认证管理器ReactiveAuthenticationManager)
- 校验用户密码是否正确
- 错误,走认证失败
- 正确走认证成功流程
- 错误,走认证失败
认证成功
作用:
- 查询并封装当前用户所分配的 角色列表、资源列表
基于查询到的用户信息构建JWT令牌并返回给前端
前端可以通过 JWT令牌 获取到当前用户的基本信息(企业号)、角色信息、资源信息
流程:
- 指定应答的状态 ,认证成功或者认证失败
- 认证成功,获得认证用户
- 构建userVo返回对象
- 处理角色构建,根据用户id查询角色列表,将角色标识存储到Set集合中
- 处理资源构建: 根据用户id查询权限(资源列表) , 将资源路径存储到Set集合中.
- 给用户指定角色 , 资源
- 构建JWT令牌,将令牌设置到返回给前端的vo对象中
- 返回最终结果
认证失败
认证失败:只需要返回错误信息即可
结果:统一返回失败信息