简单的权限控制系统(RBCA)

本猿年初的时候接手了一套后台系统,这套系统对于权限刷新了我的三观(每个用户对应一个角色ROLEID,用户访问的时候根据不同的ROLEID加载不同的模板文件,OK! A角色和B角色看到的页面就不同了)

不提这梗了,本人解释下自己对最基本的RBCA的理解,虽然简单,但应对大部分公司内部系统已经足够了

一个URL通常代表着以下类型的资源:

  • 一张网页(Page):打开网页可能伴随着数据的查询或修改,但这仍然是该类型资源的一部分
  • 获取数据(AjaxGet):只限于查询,不会对数据造成修改等影响
  • 修改数据(AjaxUpdate):通常包括增加,删除,修改
  • 文件:这个暂时未考虑

RBCA模型中涉及以下几个概念:

  • 用户(User) 即登录的用户本身,有一个用户ID(定义uid)
  • 角色(Role) 即这个用户拥有几个身份,一个用户可以有几个角色,比如一家小公司的人事专员可能即使人事,又是客服
  • 权限(Access) access英语中的含义是访问,引申为访问的资源,习惯上可以称之为权限

下面举例子:

小珍是XX公司的人事,拥有人事专员和客服两个角色
小李是XX公司的技术,拥有技术专员的角色

人事专员可以查看A页面,可以进行A页面上的aa和ab操作
客服可以查看B页面,可以进行B页面上的ba和bb操作
技术专员可以查看C页面,可以进行C页面上的ca和cb操作

那么:

小珍可以打开A页面和B页面,可以进行aa,ab,ba,bb操作,但是想打开C页面时会被提示没有权限
小李可以打开C页面,可以进行ca和cb操作,但是他想打开C页面时会被提示没有权限,他尝试直接通过URL绕过页面进行aa操作,通用也会被提示没有权限

设计的表结构
-- 访问权限表
CREATE TABLE `auth_access` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '权限名称',
  `value` varchar(255) NOT NULL DEFAULT '' COMMENT '权限值',
  `type` char(1) NOT NULL DEFAULT 'U' COMMENT '资源类型,默认为URL(''U'')',
  `comment` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `disable` tinyint(4) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
-- 角色表
CREATE TABLE `auth_role` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父ID,为0时为顶级',
  `comment` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间 ',
  `orderNo` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前',
  `name` varchar(64) NOT NULL,
  `disable` tinyint(255) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- 角色权限表
CREATE TABLE `auth_rel_role_access` (
  `rid` int(10) unsigned NOT NULL COMMENT 'role id',
  `aid` int(10) unsigned NOT NULL COMMENT 'access id',
  PRIMARY KEY (`rid`,`aid`),
  KEY `role_auth2` (`aid`),
  CONSTRAINT `aid` FOREIGN KEY (`aid`) REFERENCES `l_auth_access` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `rid` FOREIGN KEY (`rid`) REFERENCES `l_auth_role` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 用户角色表
CREATE TABLE `l_auth_rel_user_role` (
  `uid` int(10) unsigned NOT NULL COMMENT 'user id',
  `rid` int(10) unsigned NOT NULL COMMENT 'role id',
  PRIMARY KEY (`uid`,`rid`),
  KEY `rel_member_role2` (`rid`),
  KEY `mid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

要获取某个用户的所有权限值L
SELECT a.id,a.name,a.value,a.type,`disable`,IFNULL(b.role_id,0) role_id,IFNULL(b.auth_id,0) authed FROM auth_access a
LEFT JOIN (
    SELECT rmr.rid AS role_id, rra.aid AS auth_id
    FROM auth_rel_user_role rmr
    INNER JOIN auth_role r on r.id = rmr.rid and r.`disable` = 0
    INNER JOIN auth_rel_role_access rra ON rra.rid = rmr.rid
    WHERE rmr.uid = :user_id
) b ON b.auth_id = a.id;

如果用户有访问权限,authed > 0;否则 authed = 0

获取某个用户所有的角色
select  r.*,IFNULL(rr.rid,0) as roled
from role r 
left outer join rel_user_role rr on rr.rid = r.id and rr.uid = :user_id

如果用户有该角色,roled > 0;否则 roled = 0

获得某个角色所有的权限
select a.*,ifnull(rra.aid,0) as accessable from access a
left outer join rel_role_access rra on rra.aid = a.id and rra.rid = :role_id

如果用户有该角色,accessable > 0;否则 accessable = 0

如果你不需要未授权的部分,以上的查询sql只要讲left outer join 改为 inner join,ifnull函数也可以去掉

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

推荐阅读更多精彩内容