基于RBAC的分权分域用户权限系统数据库设计

引子


最近要开发一个新的系统,系统里面可以有许多不同的社区,每个社区下面有不同的项目。项目和项目、社区和社区之间都是相互独立的。我所做的工作是设计一套权限管理系统,这套系统允许不同的用户在不同的社区或者项目之中有不同的权限,可以保证用户无法做出越权的操作。

经过了一番努力,设计出了一套基于RBAC的分权分域的用户权限系统。

首先介绍一下什么是RBAC:

以角色为基础的访问控制(英语:Role-based access control, RBAC),是资讯安全领域中,一种较新且广为使用的访问控制机制,其不同于强制访问控制以及自由选定访问控制直接赋予使用者权限,而是将权限赋予角色。1996年,莱威·桑度(Ravi Sandhu)等人在前人的理论基础上,提出以角色为基础的访问控制模型,故该模型又被称为RBAC96。之后,美国国家标准局重新定义了以角色为基础的访问控制模型,并将之纳为一种标准,称之为NIST RBAC。
以角色为基础的访问控制模型是一套较强制访问控制以及自由选定访问控制更为中性且更具灵活性的访问控制技术。

在一个组织中,会因为不同的作业功能产生不同的角色,执行某项操作的权限会被赋予特定的角色。组织成员或者工作人员(抑或其它系统用户)则被赋予不同的角色,这些用户通过被赋予角色来取得执行某项计算机系统功能的权限。

  • S = 主体 = 一名使用者或自动代理人
  • R = 角色 = 被定义为一个授权等级的工作职位或职称
  • P = 权限 = 一种存取资源的方式
  • SE = 会期 = S,R或P之间的映射关系
  • SA = 主体指派
  • PA = 权限指派
  • RH = 角色阶层。能被表示为:≥(x ≥ y 代表 x 继承 y 的权限)
  • 一个主体可对应多个角色。
  • 一个角色可对应多个主体。
  • 一个角色可拥有多个权限。
  • 一种权限可被分配给许多个角色。
  • 一个角色可以有专属于自己的权限。

数据库结构设计


项目使用的mysql数据库,设计表格的大体结构如下:

分权分域数据库设计.png

蓝底模块为基本表,黄底模块为关系表

基本表有

  • t_user
  • t_role
  • t_permission
  • t_operation

关系表有

  • t_user_role_community
  • t_user_role_project
  • t_role_permission
  • t_permission_operation

权限判断的主要思路是根据用户传过来的社区ID/项目ID+用户ID+发起的请求路径,通过多表联查,来确定用户在对应的社区/项目内所对应的角色是否具有权限执行响应请求的操作。

由于在域方面,有社区和项目两个尺度,其中社区包含项目。但是由于一些其他原因,在社区表中无法表示出与项目的从属关系,只能把t_user_role表复用,分身成两张表:t_user_role_community和t_user_role_project。

由于我们的鉴权系统整个流程都是一对多的关系,即一个用户可能对应多个角色,一个角色可能对应多种权限,一种权限又能对应多种操作。因此,一个用户能对应N多种操作,同时,由于中间的多重映射关系,一个用户对某个操作可能会对应多次。

我们采用多表联查的方式,输入项为用户+操作(操作具体表示为request的method+url),使用如下SQL语句进行查询,只要查询结果不为空,即证明用户有相应的操作权限:

SELECT
    *
FROM
    t_user_role_community
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_community.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND nCommunity = 1
AND strMethod = 'get'
AND strUrl = '/api/t_service'

这样做实际上只查询了社区线的权限,此外还有项目线的权限以及非社区非项目线的权限(例如个人中心、系统管理之类的,我们把这部分的域直接设置为nCommunity=0,即项目编号为0),想要覆盖所有的域,我们相当于要同时多表联查三次,只要其中任意一次能够查到数据,则表明用户有执行该操作的权限。我们可以用UNION语句来实现:

(SELECT
    *
FROM
    t_user_role_community
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_community.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND (nCommunity = 0 OR nCommunity = 0)
AND strMethod = 'get'
AND strUrl = '/api/t_service')
UNION
(SELECT
    *
FROM
    t_user_role_project
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_project.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND nProject = 0
AND strMethod = 'get'
AND strUrl = '/api/t_service')

好啦,这就实现了一个相对完整的分权分域的系统啦~

结语


整个鉴权过程是放在后台以中间件的形式存在的。所有发送的请求都要经过鉴权中间件才能继续往后走下去。

因此,除了在数据库层面进行设计以外,还要在后台代码进行一些必要性的优化。比如说有一类操作的对应权限是通用权限,这类接口占所有接口的一半以上。因此在鉴权中间件我会先判断一步是否为通用权限,若是则跳过接下来的鉴权,直接判过;不是的话再按照既定流程继续鉴权。

也可以在鉴权层增加日志打印,把所有经过鉴权的请求记录在案,以便日后追踪。

写到这里突然发现,我这个前端,越做越往后了...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容