一、權(quán)限設(shè)計(jì)
網(wǎng)上資料說(shuō)權(quán)限設(shè)計(jì) = 功能權(quán)限 + 數(shù)據(jù)權(quán)限,我認(rèn)為還是很有道理的。之前項(xiàng)目中只涉及到功能權(quán)限,沒(méi)有數(shù)據(jù)權(quán)限,原因是最開(kāi)始設(shè)計(jì)時(shí),數(shù)據(jù)已經(jīng)綁定在特定的用戶下了,而且涉及到的表數(shù)量很少,不需要單獨(dú)考慮數(shù)據(jù)權(quán)限的問(wèn)題。
二、功能權(quán)限
權(quán)限管理,最細(xì)致的權(quán)限管理有 用戶,用戶組,角色,權(quán)限,功能。根據(jù)不同的需求適當(dāng)選擇,如 用戶量過(guò)大,每個(gè)人都授權(quán)和麻煩,就引入用戶組,對(duì)用戶組賦予權(quán)限。功能上也根據(jù)業(yè)務(wù)不同做適當(dāng)?shù)臄U(kuò)展。由于如用戶權(quán)限之前存在多對(duì)多關(guān)系,需要引入中間表。
本系統(tǒng)設(shè)計(jì)如下:

數(shù)據(jù)量很小,功能也不復(fù)雜,所以只有用戶,角色,權(quán)限(功能)及產(chǎn)生的中間表。
表中的數(shù)據(jù)都是提前填的,用戶登陸,查ermroleuser表,獲取角色,查ermrolefunction表,獲取功能,再查ermfunction表,返回該用戶的功能的中文,在頁(yè)面上展示。
功能權(quán)限詳細(xì)設(shè)計(jì)請(qǐng)參考,本項(xiàng)目也是受此啟發(fā):
http://blog.csdn.net/painsonline/article/details/7183613/
三、數(shù)據(jù)權(quán)限
需求:給一個(gè)原來(lái)沒(méi)有權(quán)限的數(shù)據(jù)配置系統(tǒng)加上登錄,權(quán)限功能,不同角色查同一張表返回結(jié)果不同。
思路:所謂數(shù)據(jù)權(quán)限,關(guān)注點(diǎn)在于實(shí)體屬性值、條件、允許值,用戶登錄后,查詢?cè)撚脩舻牟樵儣l件,根據(jù)條件獲取數(shù)據(jù)即可。詳細(xì)表結(jié)構(gòu)設(shè)計(jì)可以參考:https://zhuanlan.zhihu.com/p/31339794
CREATE TABLE `sys_acl_data` (
`id` int(11) NOT NULL,
`acl_id` int(11) NOT NULL COMMENT '對(duì)應(yīng)權(quán)限表主鍵',
`status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '狀態(tài),1:可用,0:不可用',
`param` varchar(20) NOT NULL DEFAULT '' COMMENT '參數(shù)',
`operation` int(11) NOT NULL DEFAULT 0 COMMENT '操作類型,0;等于,1:大于,2:小于,3:大于等于,4:小于等于,5:包含,6:介于之間,。。。',
`value1` varchar(100) NOT NULL DEFAULT '0',
`value2` varchar(100) NOT NULL DEFAULT '0',
`next_param_op` int(11) NOT NULL DEFAULT 0 COMMENT '后續(xù)有參數(shù)時(shí)連接的關(guān)系,0:沒(méi)有其他參數(shù)控制,1:與&&,2:或||',
`seq` tinyint(4) NOT NULL DEFAULT '0' COMMENT '順序',
PRIMARY KEY (`id`),
INDEX `idx_acl_id` USING BTREE (`acl_id`)
) ENGINE=`InnoDB` COMMENT '數(shù)據(jù)權(quán)限表';
具體介紹一下每個(gè)字段含義:
(1)主鍵 id;
(2)acl_id 映射權(quán)限點(diǎn)表主鍵,代表每行記錄是針對(duì)哪個(gè)權(quán)限點(diǎn)的;
(3)status 代表當(dāng)前這條配置是否有效,方便臨時(shí)激活與禁用;
(4)param 代表需要校驗(yàn)的參數(shù)名,允許一個(gè)請(qǐng)求有多個(gè)參數(shù)參與數(shù)據(jù)校驗(yàn);如果參數(shù)復(fù)雜,比如包含對(duì)象,定義的參數(shù)可能為a.b.c 這種多級(jí)的形式,建議不要太復(fù)雜
(5)operation 代表數(shù)據(jù)攔截的規(guī)則,使用數(shù)字代表是等于、大于、小于、大于等于、小于等于、包含、介于之間等,可以根據(jù)自己需要增加或減少支持的攔截規(guī)則
(6)value1 和 value2 用來(lái)和param、operation組成一個(gè)關(guān)系表達(dá)式,比如:1<=a<2
next_param_op 字段根據(jù)需要使用,如果一個(gè)權(quán)限點(diǎn)支持多條數(shù)據(jù)規(guī)則時(shí),連接兩個(gè)規(guī)則之間的操作,|| 還是 &&
(7)seq 字段用于某個(gè)權(quán)限點(diǎn)包含多條數(shù)據(jù)權(quán)限規(guī)則時(shí)的順序

假設(shè)有這么一條數(shù)據(jù),那么他的含義是:id為1(acl_id)的權(quán)限點(diǎn),配置了一條有效(status=1)的數(shù)據(jù)規(guī)則,規(guī)則是:傳入?yún)?shù)id(param)的值要大于(operation)10(value1)
這種設(shè)計(jì)很細(xì)致了,當(dāng)然我的項(xiàng)目沒(méi)有那么復(fù)雜,所以最終沒(méi)有采用這個(gè)。
http://www.cnblogs.com/jeffwoot/archive/2008/12/23/1359591.html講述了數(shù)據(jù)權(quán)限設(shè)計(jì)的演化過(guò)程。
本系統(tǒng)跟權(quán)限相關(guān)的表結(jié)構(gòu)如下:
