我們做企業(yè)級(jí)系統(tǒng)杂抽,權(quán)限控制主要分三類(lèi)。
【功能權(quán)限】:對(duì)菜單欄目進(jìn)行權(quán)限控制韩脏,查詢(xún)缩麸,增加,刪除赡矢,修改功能杭朱,一般來(lái)說(shuō)這種對(duì)資源的權(quán)限控制模型可以做到比較統(tǒng)一(用戶(hù)、角色吹散、資源)弧械。
【數(shù)據(jù)權(quán)限】:哪些人能看到哪些數(shù)據(jù),例如淘寶本人只能看自己訂單空民,北京地區(qū)部門(mén)領(lǐng)導(dǎo)可以看到電器類(lèi)部門(mén)訂單刃唐, 最高領(lǐng)導(dǎo)能看到人所有訂單等等。 這種跟業(yè)務(wù)高度相關(guān),(網(wǎng)絡(luò)上資料暫時(shí)比較少)原理主要是對(duì)SQL語(yǔ)句添加where 條件
【字段權(quán)限】:訂單能看到哪些字段唁桩,如供應(yīng)商闭树,看不到內(nèi)部?jī)r(jià)、 出廠價(jià)等信息荒澡。 (網(wǎng)絡(luò)上資料暫時(shí)比較少)實(shí)現(xiàn)原理跟數(shù)據(jù)權(quán)限控制是一致的报辱。對(duì)SQL語(yǔ)句添加select 條件
這次,我們主要講解最常用的功能權(quán)限控制的實(shí)現(xiàn)過(guò)程单山,這類(lèi)WEB權(quán)限控制碍现,在任意后端語(yǔ)言上都可以實(shí)現(xiàn)Java、Golang米奸、PHP昼接、Nodejs、Python等等悴晰,主要理解其數(shù)據(jù)模型慢睡。
我們先看最終實(shí)現(xiàn)的功能效果。
1.角色管理頁(yè)面
這里可以新增角色铡溪,刪除角色漂辐, 注意的是,這里有一個(gè)最高權(quán)限角色超級(jí)管理員棕硫,不允許刪除髓涯,還有一個(gè)批量導(dǎo)入管理員默認(rèn)角色。
2.新增角色,編輯角色
這里把系統(tǒng)大部分資源路由進(jìn)入權(quán)限控制哈扮,說(shuō)的大部分是因?yàn)橛行╉?yè)面權(quán)限是不需要進(jìn)行控制纬纪,例如登陸、注冊(cè)滑肉、以及后臺(tái)一些下拉選項(xiàng)(讀取的數(shù)據(jù)庫(kù)接口)包各。
3.管理員列表
4.給管理員分配權(quán)限
涉及數(shù)據(jù)表
1.用戶(hù)表
用戶(hù)表主要增加字段 rolesId 角色I(xiàn)D,了解這個(gè)用戶(hù)是哪個(gè)角色靶庙。
2.角色表
角色表主要記錄這個(gè)角色的名稱(chēng)髓棋,描述
CREATE TABLE `t_roles` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名稱(chēng)',
`desc` varchar(50) NOT NULL DEFAULT '' COMMENT '描述',
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
3.路由表
這個(gè)表主要添加平臺(tái)所有需要控制的路由方法,也可以不建表惶洲,寫(xiě)到配置文件里面,因?yàn)殚_(kāi)發(fā)完需要控制的權(quán)限是固定的膳犹。上圖:新增編輯角色恬吕,顯示的就是這個(gè)表的內(nèi)容
CREATE TABLE `t_roles_tree` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '路由名稱(chēng)',
`path` varchar(50) NOT NULL COMMENT '路徑',
`methods` varchar(50) NOT NULL COMMENT '方法',
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`parentId` varchar(50) NOT NULL DEFAULT '' COMMENT '級(jí)別',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='系統(tǒng)所有路由表';
4.權(quán)限表
權(quán)限表記錄了,這個(gè)角色有哪些權(quán)限须床。 核心字段為 [角色I(xiàn)D铐料,資源url, 方法]。這里用casbin 實(shí)現(xiàn)钠惩,因?yàn)閏asbin封裝了很多驗(yàn)證函數(shù)柒凉,節(jié)省了一部分工作量。
CREATE TABLE `casbin_rule` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`p_type` varchar(255) NOT NULL DEFAULT '',
`v0` varchar(255) NOT NULL DEFAULT '' COMMENT '角色',
`v1` varchar(255) NOT NULL DEFAULT '' COMMENT 'Url',
`v2` varchar(255) NOT NULL DEFAULT '' COMMENT '方法',
`v3` varchar(255) NOT NULL DEFAULT '',
`v4` varchar(255) NOT NULL DEFAULT '',
`v5` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4;
這一篇最后介紹下 Casbin是一個(gè)強(qiáng)大的篓跛、高效的開(kāi)源訪問(wèn)控制框架膝捞,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型。并指出主流后端語(yǔ)言愧沟,目前Casbin權(quán)限控制支持的語(yǔ)言有Go Java Node.js PHP Python C# Delphi蔬咬,使用Casbin可以極大提高權(quán)限控制開(kāi)發(fā)效率。當(dāng)然你不用這個(gè)庫(kù)沐寺,自己設(shè)計(jì)表林艘,實(shí)現(xiàn)原理是一樣。