首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简单又灵活的权限设计?

简单又灵活的权限设计?

原创
作者头像
蛋先生DX
发布于 2021-05-31 14:23:39
发布于 2021-05-31 14:23:39
66200
代码可运行
举报
文章被收录于专栏:蛋先生说识蛋先生说识
运行总次数:0
代码可运行

你:我看完能知道个啥? 我:也就以下两点吧 一. 了解基于 RBAC 思路的表设计 二. 表数据在实际开发场景中是如何使用的 你:我觉得那应该还有点干货吧 我:我不要你觉得,我要我觉得 (͡ ͡° ͜ つ ͡͡°)

丹尼尔:Hi,蛋兄,最近接到需求,需要在已有的项目加上权限相关的功能,想想我专心混前端都好久了,N久没碰表设计了,你对这些有了解吗?

蛋先生:[]( ̄▽ ̄)* 略懂略懂~!已有项目,那就是不能“随心所欲”咯。说吧,关于已有项目DB的相关信息

丹尼尔:数据库是用MySQL,连接数据库用的是Sequelize, 一个ORM的Node.js库。

蛋先生:OK,这种组合搭配建议的流程是:先用EER图工具(如MySQLWorkbench)设计表结构,然后导出SQL,最后通过 Sequelize-Auto 自动生成 Model

丹尼尔:可以啊蛋兄,自动生成SQL,自动生成 Model。好久不见,你还是那么的懒啊 (^▽^ )。你这么随便一说,就已经解决了我第一个问题了。那我们接着聊权限设计这块吧


RBAC表设计

丹尼尔:权限设计,这一块复杂吗?

蛋先生:要想多复杂就能多复杂,你想要什么样的难度系数的?<( ̄ˇ ̄)/

丹尼尔:不不不,我要既简单又灵活,可以灰常容易扩展那种的 ʅ(´◔౪◔)ʃ

蛋先生:要求挺高的嘛。现在这一块业界用的较多的是RBAC(Role-based access control)的思路,即基于角色的存取控制。话不多说,我直接上图吧

思路非常简单,就是只需给用户赋角色,而角色就决定了可以对什么资源(Resource)进行什么样的操作(Operation),Operation一般就是CRUD

丹尼尔:users 表为啥没 password 啊,为啥 code 什么都是 varchar(45) 啊

蛋先生:喂喂,先不要在意这些细节好吗?ヘ(・_|

丹尼尔:好好好。这表设计看上去挺简单的,行不行啊?

蛋先生:来,根据你的实际场景,请出招吧


功能权限

丹尼尔:假设有用户A和用户B;系统中有项目管理,用户管理两个功能;用户A是管理员,两个功能都能访问。而用户B是普通用户,只能访问项目管理,怎么弄?

蛋先生:小意思。┏ (^ω^)=☞

1. 创建数据
  • 创建资源数据:项目管理,用户管理是属于功能模块级别的资源,数据如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// resources: 
{ code: 'projects', name: 'projects', type: 'module' },
{ code: 'users', name: 'users', type: 'module' },
复制代码
  • 创建角色并赋予相关操作权限
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// roles: 
{ code: 'admin', name: 'admin' },
{ code: 'guess', name: 'guess' },

// role_permissions:
{ roleCode: 'admin', resourceCode: 'projects', operation: 'C' },
{ roleCode: 'admin', resourceCode: 'projects', operation: 'D' },
{ roleCode: 'admin', resourceCode: 'projects', operation: 'R' },
{ roleCode: 'admin', resourceCode: 'projects', operation: 'U' },
{ roleCode: 'admin', resourceCode: 'users', operation: 'C' },
{ roleCode: 'admin', resourceCode: 'users', operation: 'D' },
{ roleCode: 'admin', resourceCode: 'users', operation: 'R' },
{ roleCode: 'admin', resourceCode: 'users', operation: 'U' },
{ roleCode: 'guess', resourceCode: 'projects', operation: 'R' },
复制代码
  • 创建用户并赋予相应角色
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// users:
{ code: 'user_a', name: 'user_a' },
{ code: 'user_b', name: 'user_b' },

// user_role:
{ userCode: 'user_a', roleCode: 'admin' },
{ userCode: 'user_b', roleCode: 'guess' },
复制代码
2. 消费数据

现在我们来给前端童学提供下数据来确定用户A能看到哪些功能模块,以及要不要显示创建,删除等按钮

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    u.code userCode,
    res.code resourceCode,
    GROUP_CONCAT(DISTINCT rp.operation) operations
FROM
    resources res,
    role_permissions rp,
    roles r,
    user_role ur,
    users u
WHERE
    res.code = rp.resource_code
        AND rp.role_code = r.code
        AND r.code = ur.role_code
        AND ur.user_code = u.code
        AND res.type = 'module'
        AND u.code = 'user_a'
GROUP BY u.code , res.code
复制代码

得到的 user_a 的权限如下:

userCode

resourceCode

operations

user_a

projects

R,D,U,C

user_a

users

R,D,U,C

这样,前端只需判断 projects 是否拥有 R 的 operation,即可决定是否显示项目功能菜单。如果有 C,则显示创建按钮;有 D,则显示删除按钮;有 U,则显示编辑按钮

3. 视图简化

丹尼尔:问题是解了,但那SQL,是不是有点复杂啊 (~ ̄▽ ̄)~

蛋先生:额,确实。那就来简化一下吧。

通过以下SQL创建用户功能模块权限的视图view

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW `user_module_view` AS
    SELECT 
        ur.user_code,
        rp.resource_code,
        CONCAT('|',
                GROUP_CONCAT(DISTINCT rp.operation
                    SEPARATOR '|'),
                '|') operation
    FROM
        user_role ur,
        role_permissions rp,
        resources rs
    WHERE
        ur.role_code = rp.role_code
            AND rs.code = rp.resource_code
            AND rs.type = 'module'
    GROUP BY rp.resource_code , ur.user_code
复制代码

现在我们就可以把刚刚上面冗长的SQL简化成以下的单表操作了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    *
FROM
    user_module_view
WHERE
    user_code = 'user_a'
复制代码

备注:上边CONCAT(....)中使得operation的结果格式为:|C|R|U|D|,这样是为了能精确通过like(如like '%|R|%')来查询是否具备某一种权限


数据权限

丹尼尔:那我继续出题咯。用户A和用户B虽然都对项目管理功能有 read 权限,但用户B是普通用户,假设用户B属于OrgB组织,那他就只能查看OrgB下的项目时该昨弄?

蛋先生:那就可以对operation进行扩展了。现在我们修改下 role_permission 的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ roleCode: 'guess', resourceCode: 'projects', operation: 'R' } 
=>
{ roleCode: 'guess', resourceCode: 'projects', operation: 'R_ORG' },
复制代码

这表示 guess 角色对 projects 资源拥有 org 范围的 read 权限。这样当服务端接口在取项目列表数据时,可以根据 R_ORG 的操作标志位来决定列表数据的过滤条件


数据项级别权限

丹尼尔:常规的需求好像都没什么问题。不过我现在这边有个权限相关的需求,不知道你这套能不能派上用场

蛋先生:来吧,我今天就奉陪到底了 ( ̄︶ ̄)↗

丹尼尔:那我就不客气了。我的项目管理功能中,每个项目创建后都默认有 view / edit / admin 角色。上面的例子只能对指定范围(比如org)的项目作相同的操作,但不同项目指定不同的操作,好像实现不了

蛋先生:[]( ̄▽ ̄)* 那就换个角度呗,把每一个项目都当作资源怎么样。

丹尼尔:能说得具体一些吗?最好能说下创建项目的时候权限这块该做些什么

蛋先生:咳咳咳~,没问题,来咯

按你的要求,在创建项目时,就需要初始化相应的内置角色,这样才能给用户分配角色。下面就说下假设创建项目project_a,需要给哪些表增加哪些数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. add resource:  
{ code: 'project_a', name: 'project_a', type: 'project' }


// 2. add roles: 
{ code: 'pro_a_view', name: 'pro_a_view' },
{ code: 'pro_a_edit', name: 'pro_a_edit' },
{ code: 'pro_a_admin', name: 'pro_a_admin' },

// 3. add role_permission:
{ roleCode: 'pro_a_view', resourceCode: 'project_a', operation: 'R' },
{ roleCode: 'pro_a_edit', resourceCode: 'project_a', operation: 'R' },
{ roleCode: 'pro_a_edit', resourceCode: 'project_a', operation: 'U' },
{ roleCode: 'pro_a_admin', resourceCode: 'project_a', operation: 'R' },
{ roleCode: 'pro_a_admin', resourceCode: 'project_a', operation: 'U' },
{ roleCode: 'pro_a_admin', resourceCode: 'project_a', operation: 'D' },
复制代码

这样只需要给用户B增加pro_a_view角色,用户B即拥有对 project_a 的读权限

注意这里operation并没有C,因为资源是指单个项目,所以单个项目哪来的create呢?是吧 (^▽^ )

丹尼尔:恩,看上去跟整个项目功能作为资源的时候是一个样的。但我发现个问题,如果以每个项目作为资源,那我要查询用户B能看到哪些项目,好像很麻烦啊。总不能一个一个找,然后合在一起吧

蛋先生:当然,还记得上面我们用过视图view吗?现在我们也给 project 类型的资源创建个view吧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW 'user_project_view' AS 
    SELECT 
        ur.user_code,
        rp.resource_code,
        CONCAT('|',
                GROUP_CONCAT(DISTINCT rp.operation
                    SEPARATOR '|'),
                '|') operation
    FROM
        user_role ur,
        role_permissions rp,
        resources rs
    WHERE
        ur.role_code = rp.role_code
            AND rs.code = rp.resource_code
            AND rs.type = 'project'
    GROUP BY rp.resource_code , ur.user_code
复制代码

这样同样只需单表就能查询用户B能查看的项目列表以及每个项目的操作权限了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    *
FROM
    user_project_view
WHERE
    user_code = 'user_b'
        AND operation LIKE '%|R|%'
复制代码

特殊的权限要求

丹尼尔:哎呦不错。我还有最后一个需求,就是项目中的图片资源,如果用户B对 project_a 拥有 edit 角色,则只能删除自己添加的图片资源,不能删除其他人添加的图片资源,这个能实现吗。图片资源我可不想再像项目一样作为资源记录哦

蛋先生:(lll¬ω¬) 这个嘛...

丹尼尔:看来难倒你了,哈哈

蛋先生:非也非也。强大的operation可不是吃素的。我只需对edit角色的update操作权限增加limited的修饰符即可。如U_LIMITED

丹尼尔:这都行,好像有道理哦。由于operation可以扩展,所以只要我们规定了它的行为,好像什么都可以搞定一样

蛋先生:All right。扩展性是一定要具备的,而operation就是扩展的关键所在。operation定义了操作标志符,开发者根据操作标志符的约定,实现指定逻辑即可

丹尼尔:明白了,谢了,蛋兄,告辞告辞

蛋先生:客气客气,走好不送!


此处已结束,感谢观看!(๑¯∀¯๑)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊简单又灵活的权限设计(RBAC)
丹尼尔:Hi,蛋兄,最近接到需求,需要在已有的项目加上权限相关的功能,想想我专心混前端都好久了,N久没碰表设计了,你对这些有了解吗?
小小许
2020/10/28
1.5K0
聊聊简单又灵活的权限设计(RBAC)
MySQL项目实战演练:搭建用户管理系统的完整数据库结构【MySQL系列】
本项目适用于后台管理系统、电商用户中心、SaaS 用户模块等场景,特别适合开发者进行实战演练与面试准备。
大熊计算机
2025/07/14
1560
用户、角色、权限表的关系(mysql)
`description` varchar(255) DEFAULT NULL,
全栈程序员站长
2022/11/10
6.7K0
用户、角色、权限表的关系(mysql)
MySQL多表查询详解:内连接、外连接、自连接通通搞懂【MySQL系列】
本文将全面深入讲解 MySQL 多表查询的核心内容,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN(模拟实现)、自连接、UNION 等,通过大量示例与实战分析,帮助你全面掌握表与表之间的联动查询技巧。
大熊计算机
2025/07/14
6960
MySQL增删改查基础教程:熟练掌握DML语句操作【MySQL系列】
DML(Data Manipulation Language)是SQL语言的一个子集,主要用于对数据库中已存在的数据进行增、删、改、查操作。常用的四类语句包括:
大熊计算机
2025/07/14
4730
MySQL数据表操作全指南:建表、修改、删除一步到位【MySQL系列】
在关系型数据库中,表是存储数据的核心载体。日常开发中,表的结构往往需要根据业务需求演进:新表上线、字段变更、索引优化、表拆分与归档,以及在项目废弃时的表删除。因此,熟练掌握 DDL(Data Definition Language)语句,能够保障线上变更的平滑与安全。
大熊计算机
2025/07/14
9620
CP-052考试题库汇总(56)-CUUG内部解答版
1.USERS is the database default tablespace.
用户5892232
2019/09/18
5020
CP-052考试题库汇总(56)-CUUG内部解答版
五表权限_表格设置查看权限和编辑权限
设计基础:用户、角色、权限三大核心表,加上用户角色、角色权限两个映射表(用于给用户表联系上权限表)。这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限。
全栈程序员站长
2022/11/11
4.6K0
五表权限_表格设置查看权限和编辑权限
基于实战的方案选型策略:以Web系统权限设计为例
在实际开发过程中,面对一个需求,我们往往不缺“可行方案”,而是缺少“最合适的落地方案”。本篇文章将从一个典型的实际场景出发——Web系统的权限管理模块,来讲解在实战中如何进行有效的方案选型,并最终稳定落地。
一键难忘
2025/05/07
6340
MySQL事务与锁机制详解:确保数据一致性的关键【MySQL系列】
本文将系统讲解 MySQL 中事务的四大特性、隔离级别与实现原理,深入拆解锁机制的种类与应用场景,并结合典型死锁案例进行分析,为你构建起应对复杂一致性问题的坚实基础。
大熊计算机
2025/07/14
1790
五. Spring Security 权限管理
概述 权限是大部分的后台管理系统都需要实现的功能,用户控制不同的角色能够进行的不同的操作。Spring Security的可以进行用户的角色权限控制,也可以进行用户的操作权限控制。在之前的代码实现上,我们仅仅只是实现用户的登录,在用户信息验证的时候使用UserDetailsService,但是却一直忽略了用户的权限。 一. 启动类配置 /** * 开启方法的注解安全校验。 * securedEnabled @Secured("ROLE_abc") 该注解是Spring security提供的
一斤代码
2020/09/21
1.6K0
五. Spring Security 权限管理
MySQL索引与性能优化入门:让查询提速的秘密武器【MySQL系列】
本文将深入讲解 MySQL 索引的底层原理、常见类型、使用技巧,并结合 EXPLAIN 工具分析查询执行计划,配合慢查询日志识别瓶颈,逐步建立起系统的 MySQL 查询优化知识体系。适合有一定基础、希望在数据量增长或面试中脱颖而出的开发者阅读。
大熊计算机
2025/07/14
2680
vue-element-admin整合spring-boot权限设计之实现用户授权功能
这篇文章笔者紧接着上一篇权限设计的文章vue-element-admin整合spring-boot实现权限控制之用户管理篇
用户3587585
2021/09/08
1.1K0
vue-element-admin整合spring-boot权限设计之实现用户授权功能
MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
本文将深入探讨 MySQL 高级查询技巧,重点讲解 GROUP BY、HAVING、各种聚合函数、子查询以及分页查询(LIMIT 语法)的使用。文章内容涵盖实际应用中最常见的报表需求和分页实现技巧,适合有一定 SQL 基础的开发者进一步提升技能。
大熊计算机
2025/07/14
2680
Spring Security----RBAC权限控制模型,和权限相关知识点整理
我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问、操作、数据权限。形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control)、强制访问控制(MAC: Mandatory Access Control)、基于属性的权限验证(ABAC: Attribute-Based Access Control)等。最常被开发者使用也是相对易用、通用的就是RBAC权限模型(Role-Based Access Control),本文就将向大家介绍该权限模型。
大忽悠爱学习
2021/12/07
7.6K0
Spring Security----RBAC权限控制模型,和权限相关知识点整理
基于RBAC模型的权限系统设计(Github开源项目)
计划在Team的Github开源项目里加入权限控制的业务功能。从而实现权限控制。在很多管理系统里都是有权限管理这些通用模块的,当然在企业项目里,权限控制是很繁杂的。 Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎star(收藏)
SmileNicky
2019/01/17
3.9K0
SpringBoot2.x集成Apache Shiro并完成简单的Case开发
在上文 Apache Shiro权限框架理论介绍 中,我们介绍了Apache Shiro的基础理论知识。本文我们将在 SpringBoot 中集成Apache Shiro,完成一些简单的Case开发。
端碗吹水
2020/09/23
6710
SpringBoot2.x集成Apache Shiro并完成简单的Case开发
快速学习-Mybatis 多表查询之多对多
通过前面的学习,我们使用 Mybatis 实现一对多关系的维护。多对多关系其实我们看成是双向的一对多关系。
cwl_java
2020/04/01
6710
005.OpenShift访问控制-权限-角色
Kubernetes namespace提供了将一组相关资源组合在一起的机制。在Red Hat OpenShift容器平台中,project是一个带有附加注释的Kubernetes namespace。
木二
2020/06/23
3.8K0
Jenkins常用插件介绍之权限控制插件Role-based Authorization Strategy
除了搭建jenkins时默认安装的插件之外,有时候扩展功能,还需要安装一些其他的插件,下面为大家简单介绍一下Role-based Authorization Strategy插件。
小博测试成长之路
2021/03/08
3.4K0
Jenkins常用插件介绍之权限控制插件Role-based Authorization Strategy
推荐阅读
相关推荐
聊聊简单又灵活的权限设计(RBAC)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档