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

简单又灵活的权限设计?

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

你:我看完能知道个啥? 我:也就以下两点吧 一. 了解基于 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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Word2Vec模型开发全记录:从理论到实践的技术探索
Word2Vec作为一种流行的词嵌入(Word Embedding)技术,由Tomas Mikolov等人在2013年提出,彻底改变了自然语言处理领域对词语表示的方式。它是一种基于神经网络的语言模型,旨在通过学习词与词之间的上下文关系来生成词的密集向量表示。Word2Vec的核心思想是利用词在文本中的上下文信息来捕捉词之间的语义关系,从而使得语义相似或相关的词在向量空间中距离较近。
鼓掌MVP
2025/09/27
1970
Word2Vec模型开发全记录:从理论到实践的技术探索
PyTorch实现Word2Vec
其中两个必选参数num_embeddings表示单词的总数目,embedding_dim表示每个单词需要用什么维度的向量表示。而nn.Embedding权重的维度也是(num_embeddings, embedding_dim),默认是随机初始化的
mathor
2020/04/14
4.6K1
Transformer注解及PyTorch实现(下)
我们使用标准WMT 2014英语-德语数据集进行了训练,该数据集包含大约450万个句子对。使用字节对的编码方法对句子进行编码,该编码具有大约37000个词的共享源-目标词汇表。对于英语-法语,我们使用了WMT 2014 英语-法语数据集,该数据集由36M个句子组成,并将词分成32000个词片(Word-piece)的词汇表。
YoungTimes
2022/04/28
1K0
Transformer注解及PyTorch实现(下)
【入门】PyTorch文本分类
文本分类是NLP领域的较为容易的入门问题,本文记录文本分类任务的基本流程,大部分操作使用了torch和torchtext两个库。
zenRRan
2020/02/18
2K0
3.词向量word2vec(图学习参考资料1)
项目链接: https://aistudio.baidu.com/aistudio/projectdetail/5009409
汀丶人工智能
2022/11/20
5780
一文看懂Transformer内部原理(含PyTorch实现)
  "Attention is All You Need" 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。
10JQKA
2018/12/28
2.8K0
无所不能的Embedding 1 - Word2vec模型详解&代码实现
word2vec是google 2013年提出的,从大规模语料中训练词向量的模型,在许多场景中都有应用,信息提取相似度计算等等。也是从word2vec开始,embedding在各个领域的应用开始流行,所以拿word2vec来作为开篇再合适不过了。本文希望可以较全面的给出Word2vec从模型结构概述,推导,训练,和基于tf.estimator实现的具体细节。完整代码戳这里 https://github.com/DSXiangLi/Embedding
风雨中的小七
2020/08/11
1.9K0
无所不能的Embedding 1 - Word2vec模型详解&代码实现
pytorch实战---IMDB情感分析
在代码中设置日志的作用是记录程序的运行状态、调试信息和重要事件,以便在开发和生产环境中更轻松地诊断问题和了解程序的行为。设置日志有以下作用:
小馒头学Python
2024/04/28
8870
pytorch实战---IMDB情感分析
教程 | 利用AllenNLP,百行Python代码训练情感分类器
情感分析是一种流行的文本分析技术,用来对文本中的主观信息进行自动识别和分类。它被广泛用于量化观点、情感等通常以非结构化方式记录的信息,而这些信息也因此很难用其他方式量化。情感分析技术可被用于多种文本资源,例如调查报告、评论、社交媒体上的帖子等。
机器之心
2018/12/05
1.5K0
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
deephub
2025/08/20
2190
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
循环神经网络——上篇【深度学习】【PyTorch】【d2l】
序列模型主要用于处理具有时序结构的数据, **时序数据是连续的,**随着时间的推移,如电影评分、电影奖项、电影导演演员等。
来杯Sherry
2023/09/19
5220
循环神经网络——上篇【深度学习】【PyTorch】【d2l】
cs224d-第二课-word2vec
首先我想说下为什么会去学习cs224d,原先我一直是做工程的,做了大概3年,产品做了好多,但是大多不幸夭折了,上线没多久就下线,最后实在是经受不住心灵的折磨,转行想做大数据,机器学习的,前不久自己学习完了Udacity的深度学习,课程挺好,但是在实际工作中,发现课程中的数据都是给你准备好的,实践中哪来这么多好的数据,只能自己去通过各种手段搞数据,苦不堪言。在找数据的过程中,发现做多的数据还是文本数据,不懂个nlp怎么处理呢,于是就来学习cs224d这门课程,希望在学习过程中能快速将课程所学应用到工作中,fighting!
zhuanxu
2018/08/23
7590
cs224d-第二课-word2vec
DL杂记:word2vec之TF-IDF、共轭矩阵、cbow、skip-gram
版权声明:本文为博主原创文章,未经博主允许不得转载。有问题可以加微信:lp9628(注明CSDN)。 https://blog.csdn.net/u014365862/article/details/87800246
MachineLP
2019/05/26
8580
【AI 大模型】RAG 检索增强生成 ③ ( 文本向量 | Word2Vec 词汇映射向量空间模型 - 算法原理、训练步骤、应用场景、实现细节 | Python 代码示例 )
Word2Vec 是一个 将 词汇 映射 到 高维向量空间 的模型 , 其 核心思想 是 通过大量的文本数据来学习每个词的向量表示 , 使得 语义相似 的 单词 或 汉字 在向量空间中彼此接近 ;
韩曙亮
2024/08/20
2.4K0
【AI 大模型】RAG 检索增强生成 ③ ( 文本向量 | Word2Vec 词汇映射向量空间模型 - 算法原理、训练步骤、应用场景、实现细节 | Python 代码示例 )
PyTorch 2.2 中文官方教程(七)
在本教程中,我们将展示如何使用 torchtext 库构建文本分类分析的数据集。用户将有灵活性
ApacheCN_飞龙
2024/02/05
9240
PyTorch 2.2 中文官方教程(七)
Tensorflow实现word2vec
摘要总结:本文研究了如何通过使用技术社区中的内容编辑人员来提高内容质量,并总结了相关的方法和实践。
GavinZhou
2018/01/02
1.5K0
Tensorflow实现word2vec
从锅炉工到AI专家(9)
无监督学习 前面已经说过了无监督学习的概念。无监督学习在实际的工作中应用还是比较多见的。 从典型的应用上说,监督学习比较多用在“分类”上,利用给定的数据,做出一个决策,这个决策在有限的给定可能性中选择其中一种。各类识别、自动驾驶等都属于这一类。 无监督学习则是“聚类”,算法自行寻找输入数据集的规律,并把它们按照规律分别组合,同样特征的放到一个类群。像自然语言理解、推荐算法、数据画像等,都属于这类(实际实现中还是比较多用半监督学习,但最早概念的导入还是属于无监督学习)。 无监督学习的确是没有人工的标注,
俺踏月色而来
2018/06/20
6820
文本数据建模流程范例
我们在实践中通常会遇到的数据类型包括结构化数据,图片数据,文本数据,时间序列数据。
lyhue1991
2020/07/20
2.1K1
文本数据建模流程范例
AI大模型之路 第三篇:从零实现词嵌入模型,加深理解!
今天我们研究「AI大模型第三篇」:词维度预测,很多读者听过词嵌入,这篇文章解答下面问题:
double
2024/04/25
8620
AI大模型之路 第三篇:从零实现词嵌入模型,加深理解!
极简使用︱Gemsim-FastText 词向量训练以及OOV(out-of-word)问题有效解决
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/83041424
悟乙己
2019/05/26
3.8K0
推荐阅读
相关推荐
Word2Vec模型开发全记录:从理论到实践的技术探索
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档