簡單的權(quán)限控制系統(tǒng)(RBCA)

本猿年初的時候接手了一套后臺系統(tǒng)抚垃,這套系統(tǒng)對于權(quán)限刷新了我的三觀(每個用戶對應(yīng)一個角色ROLEID趟大,用戶訪問的時候根據(jù)不同的ROLEID加載不同的模板文件铣焊,OK! A角色和B角色看到的頁面就不同了)

不提這梗了,本人解釋下自己對最基本的RBCA的理解曲伊,雖然簡單,但應(yīng)對大部分公司內(nèi)部系統(tǒng)已經(jīng)足夠了

一個URL通常代表著以下類型的資源:

  • 一張網(wǎng)頁(Page):打開網(wǎng)頁可能伴隨著數(shù)據(jù)的查詢或修改,但這仍然是該類型資源的一部分
  • 獲取數(shù)據(jù)(AjaxGet):只限于查詢岛蚤,不會對數(shù)據(jù)造成修改等影響
  • 修改數(shù)據(jù)(AjaxUpdate):通常包括增加涤妒,刪除赚哗,修改
  • 文件:這個暫時未考慮

RBCA模型中涉及以下幾個概念:

  • 用戶(User) 即登錄的用戶本身,有一個用戶ID(定義uid)
  • 角色(Role) 即這個用戶擁有幾個身份屿储,一個用戶可以有幾個角色,比如一家小公司的人事專員可能即使人事民褂,又是客服
  • 權(quán)限(Access) access英語中的含義是訪問,引申為訪問的資源买羞,習慣上可以稱之為權(quán)限

下面舉例子:

小珍是XX公司的人事雹食,擁有人事專員和客服兩個角色
小李是XX公司的技術(shù),擁有技術(shù)專員的角色

人事專員可以查看A頁面吃挑,可以進行A頁面上的aa和ab操作
客服可以查看B頁面街立,可以進行B頁面上的ba和bb操作
技術(shù)專員可以查看C頁面,可以進行C頁面上的ca和cb操作

那么:

小珍可以打開A頁面和B頁面逛犹,可以進行aa,ab,ba,bb操作,但是想打開C頁面時會被提示沒有權(quán)限
小李可以打開C頁面虽画,可以進行ca和cb操作荣病,但是他想打開C頁面時會被提示沒有權(quán)限,他嘗試直接通過URL繞過頁面進行aa操作脖岛,通用也會被提示沒有權(quán)限

設(shè)計的表結(jié)構(gòu)
-- 訪問權(quán)限表
CREATE TABLE `auth_access` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '權(quán)限名稱',
  `value` varchar(255) NOT NULL DEFAULT '' COMMENT '權(quán)限值',
  `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;

-- 角色權(quán)限表
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;

要獲取某個用戶的所有權(quán)限值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;

如果用戶有訪問權(quán)限揣苏,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

獲得某個角色所有的權(quán)限
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

如果你不需要未授權(quán)的部分汤善,以上的查詢sql只要講left outer join 改為 inner join,ifnull函數(shù)也可以去掉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末票彪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子在旱,更是在濱河造成了極大的恐慌,老刑警劉巖桶蝎,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件登渣,死亡現(xiàn)場離奇詭異铃彰,居然都是意外死亡芯咧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門邪铲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來无拗,“玉大人,你說我怎么就攤上這事揽惹。” “怎么了搪搏?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵疯溺,是天一觀的道長。 經(jīng)常有香客問我恃疯,道長,這世上最難降的妖魔是什么今妄? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任蛙奖,我火速辦了婚禮杆兵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攒砖。我一直安慰自己日裙,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布受神。 她就那樣靜靜地躺著格侯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪联四。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天醉拓,我揣著相機與錄音收苏,去河邊找鬼。 笑死鹿霸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的杜跷。 我是一名探鬼主播矫夷,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼双藕,長吁一口氣:“原來是場噩夢啊……” “哼忧陪!你這毒婦竟也來了近范?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叶堆,失蹤者是張志新(化名)和其女友劉穎斥杜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忘渔,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡畦粮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年乖阵,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣赔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡义起,死狀恐怖拉背,靈堂內(nèi)的尸體忽然破棺而出师崎,到底是詐尸還是另有隱情默终,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布犁罩,位于F島的核電站齐蔽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏床估。R本人自食惡果不足惜含滴,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丐巫。 院中可真熱鬧谈况,春花似錦勺美、人聲如沸赡茸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叭喜。三九已至蓖谢,卻和暖如春蜈抓,著一層夾襖步出監(jiān)牢的瞬間委可,已是汗流浹背腊嗡。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工卡者, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崇决,地道東北人恒傻。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓官边,卻偏偏與公主長得像外遇,于是被迫代替她去往敵國和親臀规。 傳聞我的和親對象是個殘疾皇子塔嬉,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容