RBAC 模型 鉴权,最终的权限怎么实现?

根据RBAC 模型的定义,我在数据库中建了有下面五个表:

用户表,用户-角色关联表,角色表,角色-权限关联表,权限表

现在我已经写好了对应的拦截器,并且在拦截器中通过token获取到用户,再通过这几张表获取到当前用户所拥有的权限列表了,

但是这个权限列表是怎么用的?

就比如 : 我知道前端项目需要做动态路由的时候会需要后端帮忙存储一个 路由表,一个 角色-路由关联表 ,是不涉及到权限表的,或者说这个路由表就是权限表。

那么现在,后端有100个 接口,其中各自需要对应的角色,有十个游客可以访问,二十个需要登录才能访问,三十个需要管理员才能访问,四十个需要超级管理员才能访问。那是不是也需要像路由一样在数据库存一个 接口地址的表 和一个 角色-接口地址关联表 ? 那这样的话,权限表也没有用到呀?还是有什么其他方案呢?

阅读 2.2k
2 个回答

RBAC 5张表是最基础的5张,这里的权限表是一个统称,权限也就是拥有的资源,页面,按钮,接口,文件,等等都能称作是资源,每种资源我们都需要建立一张表存放这个资源的清单,然后往角色-权限关联表中插入数据以给角色分配这种资源的权限。
所以你说的路由表和角色-路由关联表,其实就是页面资源表,和角色-权限关联表。
我们典型的使用资源表就是两张,一个页面资源表,一个按钮资源表,外加一个辅助的按钮和页面的关系表,这样我们通过权限就管理起来了前端的页面权限和按钮权限。
至于如果你还想控制接口权限,你可以选择再增加一张接口资源表,但为了省事现在大多数系统都是把按钮权限拿来复用当做接口权限,你在前端页面没有这个按钮权限,那么按钮对应的后端接口你也没有权限,这两者绑定在一起也说得通的,不知道你理解没有。
分享一下我最近刚做的:
这个是菜单和按钮管理
image.png
这个是权限管理
image.png
权限管理就是将资源分配给角色,分配好以后,我们就可以在前端及后端读取当前用户的角色,查询角色拥有的资源,判断是否包含当前资源,前端页面资源控制可以使用动态路由,按钮资源控制可以使用vue自定义指令,后端接口资源控制可以使用Aop+自定义注解,也可以选择集成springSecurity

每个接口的访问都是对应到某个具体的权限,用户具有这个权限就可以访问,不具有就不可访问。
用户是不是具有这个权限,就看用户所有角色中是不是有这个权限项。
这样的好处就是方便的处理一类具有 相同权限的用户,一起管理,添加删除修改权限,角色的目的就是为了方便批量处理权限。 没有角色的话系统也可以运作,只不过需要针对每个用户分别设置每个权限项。

同时,权限项跟接口并不是一一对应的,接口是开发对接的东西,权限项是给运维甚至用户直接看到和使用的,比如存在不匹配的情况,对于用户理解的一个权限项,可能意味着3个接口可用,但是其中一个接口的部分参数有效,这是有可能的。

推荐问题
宣传栏