前言:在分布式微服务系统中,鉴权是一个调用非常频繁且非常重要的模块,而如果在每个微服务子系统中都加入鉴权代码,则会导致代码冗余程度非常高,例如本人公司目前的工程中,子系统就多达11个。那么鉴权如果不能在每个微服务中都写一套代码,那应该写在哪里呢?思考一下,我们需要对每个请求都进行鉴权,所以我们需要在一个所有请求都要经过的路上设置一道关卡,来检查是否有权限访问该接口或者令牌合不合法,那这个所有请求都要经过的地方是哪里呢?答案就是:网关服务。
那么这里还是会有一个问题:既然我是一个分布式微服务系统,那么网关也可能会有多个,那我岂不是也要在每一个网关去写鉴权代码?
答:接下来就要请出我们今天的主角——鉴权中心。有了鉴权中心,所有的请求鉴权都会在鉴权中心进行,这样就不用在每个网关都写一套鉴权代码了。
知道了鉴权节点后,我们先来构建我们的UPMS服务。
UPMS:User and Permission Management System 用户与权限管理系统
Step1:构思用户体系和构建用户权限模型。
我们在进行一个系统的构建时,用户体系的构思和构建是必不可少的,这关系到我们这个系统的接口安全问题,所以我们需要搭建出一套完整的用户权限控制模型,也就是RBAC权限模型。
市面上现在已经有非常多的RBAC权限模型可以供各位参考,这里我就不过多赘述RBAC的概念了,各位不了解的小伙伴可以自行百度,知乎上也有非常多通俗易懂的解释。
接下来,我就根据我自己的需求来构建一个RBAC模型:由于本人自主搭建的一个网站是属于B2C的网站,所以我我们只需要对B端用户后台管理进行权限模型的引入,而C端则暂时无需做权限控制。
Step1-1:对经典RBAC模型的优化设计。
在大多数后台管理系统中,权限模块的设计,很多都是基于经典的 RBAC 权限设计模型。
然而在实际生产环境中,如果只是照搬经典的 RBAC 模型,是很难满足实际项目的需求。
比如,简单的 RBAC 只能覆盖后台接口 (权限资源) 的权限验证,对于前后端分离的架构,是无法控制前端页面组件的显示隐藏,或是禁用可用的。
所以,为了更好的支持前后端分离的架构,我们可以引入权限字,用来唯一标识前端的页面组件,比如按钮组件、卡片或Tab容器组件等。下面先简单对比一下典型 RBAC 和引入权限字后权限模型的差别。
在用户登录时,后台登录接口会根据当前用户Id,获取该用户实际可用的权限字列表和权限资源列表,分别返回给前端和存入后台 Redis 缓存。权限字列表在返回前端后,前端应用会将其保存至浏览器的 SessionStorage 中,每次访问表单页面时,都会逐一比对页面组件的标识符,是否存在于当前 SessionStorage 缓存的已授权权限字列表之中,如不存在,按钮组件将被禁用,而卡片或Tab容器组件会被直接隐藏。
请仔细理解一下上面这段话:前端的每一个组件都会有一个唯一的权限字标识,对应sys_perm_code权限字表,在用户登录时,会把所有当前用户相关的权限字和权限资源反会到前端的SessionStorage中,前端再通过具体的权限字来判断组件是否需要隐藏。
Step1-2:权限模块表设计及应用
我们对经典的RBAC模型进行改进设计后,我们就可以开始从概念模型到关系模型的转化了。
我这里使用到的模型转化工具是PowerDesigner,他可以很方便的帮我们实现从概念模型(ER)到关系模型(代码)的转化。PowerDesigner的使用可以参考以下文章:PowerDesigner(CDM)画ER图并导出且在DBMS中运行_cdm怎么画_*Slime*的博客-CSDN博客
https://blog.csdn.net/qq_43333395/article/details/105858979
我们对上面的模型进一步细化,落实到每一个需要创建的表上:
注:请忽略PowerDesign生成的外键。
中间有个小插曲:写到一半发现还未设置基础属性自动填充,所以去配置了一下对所有实体Model中的基础属性(如:updateUser、createUser等)填充的MybatisPlus处理器。
有兴趣的小伙伴可以点击我另外发布的链接查看配置过程,里面还包含了MybatisPlus元数据处理器的源码分析等干货:MybatisPlus元数据处理器源码探究:自动写入创建时间、创建人人等。(包含反射浅度探究)_ToneyMa的博客-CSDN博客
https://blog.csdn.net/Mccson/article/details/131429647
Step2:搭建服务。
表构建好之后,我们就可以开始搭建我们的鉴权中心服务了。目录结构如下图:
这边我们把Upms放到跟Gateway放到同一级的父模块中去,具体的项目架构在这里不做详细的介绍,有兴趣的可以查看该开源项目:LT-travel: 高度遵守阿里巴巴开发规范打造的微服务脚手架 (gitee.com)
https://gitee.com/PonyMaxinzhe/LT-travel