??????首先上文權(quán)限設(shè)計拙見(1)中只是想記錄下自己權(quán)限設(shè)計上的一點看法,以及將自己日常最常用的權(quán)限解決方案記錄下來以供日后回顧,沒想到有朋友關(guān)注此類的設(shè)計,那就只能先把代碼拿出來獻(xiàn)丑了,拋磚引玉,大家共同探討學(xué)習(xí)

??????接著上文來說,上文所討論的權(quán)限設(shè)計是一條思路,但既然是web應(yīng)用,少不了數(shù)據(jù)庫的支持,本文我們來討論一下數(shù)據(jù)庫的設(shè)計。(以下想法及思路僅僅代表本人拙見)
????? 說到權(quán)限的數(shù)據(jù)庫設(shè)計,必先理清權(quán)限中幾種實體及其關(guān)系,此部分想必有過設(shè)計權(quán)限經(jīng)驗的同仁都知道怎么設(shè)計了,網(wǎng)上擺渡一下也是一褲衩子一褲衩子的,我們就在最平凡直觀的數(shù)據(jù)庫關(guān)系的基礎(chǔ)上來建立權(quán)限。下面是我的幾個表(所有的表都帶有一個pk_id,作為表的自動生成的唯一主鍵):
用戶表(T_UserInfo):
?1
/**//*==============================================================*/
?2
/**//*?Table:?T_UserInfo????????????????????????????????????????????*/
?3
/**//*==============================================================*/
?4
create?table?T_UserInfo?
?5
(
?6
????pk_id????????????????NUMBER?????????????????????????not?null,
?7
????name?????????????????VARCHAR2(20),
?8
????sex??????????????????BOOLEAN,
?9
????age??????????????????int,
10
????emp_num??????????????NUMBER,
11
????polity???????????????int,
12
????unit?????????????????VARCHAR2(50),
13
????department???????????VARCHAR2(20),
14
????specialty????????????int,
15
????position?????????????VARCHAR2(10),
16
????offtel???????????????VARCHAR2(20),
17
????famtel???????????????VARCHAR2(20),
18
????post_state???????????VARCHAR2(10),
19
????remark???????????????VARCHAR2(100),
20
????constraint?PK_T_USERINFO?primary?key?(pk_id)
21
); 用戶表就不多說了,都是一些常用字段,年齡、電話、職位等,建議大家建立一個通用一些,字段多一些的一個用戶表,便于以后擴(kuò)展,以后如果有特殊需求,不用擴(kuò)這個基本表,可以通過主外鍵關(guān)系來新建一個表,用于擴(kuò)充字段
角色表(T_RoleInfo):
?1
/**//*==============================================================*/
?2
/**//*?Table:?T_RoleInfo????????????????????????????????????????????*/
?3
/**//*==============================================================*/
?4
create?table?T_RoleInfo?
?5
(
?6
????pk_id????????????????number?????????????????????????not?null,
?7
????role_name????????????VARCHAR2(20),
?8
????role_desc????????????VARCHAR2(100),
?9
????parent_role_id???????NUMBER,
10
????constraint?PK_T_ROLEINFO?primary?key?(pk_id)
11
); 角色表中需要說明的就一個parent_role_id父角色id,此字段用來擴(kuò)展角色的繼承關(guān)系。
資源表(T_ResourceInfo):
?1
/**//*==============================================================*/
?2
/**//*?Table:?T_ResourceInfo????????????????????????????????????????*/
?3
/**//*==============================================================*/
?4
create?table?T_ResourceInfo?
?5
(
?6
????pk_id????????????????NUMBER?????????????????????????not?null,
?7
????module_name??????????VARCHAR2(20),
?8
????module_code??????????VARCHAR2(10),
?9
????module_desc??????????VARCHAR2(100),
10
????privilege_name???????VARCHAR2(10),
11
????privilege_code???????CHAR,
12
????privilege_desc???????VARCHAR2(100),
13
????constraint?PK_T_RESOURCEINFO?primary?key?(pk_id)
14
);
15
這個表需要說明的就比較多了,首先該表用來記錄資源與資源權(quán)限,我這邊所謂的資源就是實體,就是數(shù)據(jù)庫表,角色需要對應(yīng)到資源,有些角色對該資源有權(quán)限,有些角色則對該資源無權(quán)限,角色可對此資源操作的權(quán)限也不同。說白了,就是不同的角色對不同的數(shù)據(jù)庫表的操作權(quán)限不同。因此我們這里的資源就是數(shù)據(jù)庫表。
module_name:資源名;module_code:資源代碼(存放數(shù)據(jù)庫表名);
privilege_name:權(quán)限名;privilege_code:權(quán)限代碼(代表權(quán)限的code,也就是我們上文所說的權(quán)值)
例如角色a對數(shù)據(jù)庫表T_UserInfo有添加與刪除的權(quán)限則該表應(yīng)該按照如下配置:
module_name:人員信息;
module_code:T_UserInfo
privilege_name:添加與刪除
privilege_code:6
這里我們假設(shè)的是2的0次方為添加權(quán)限,2的1次方為添加權(quán)限,2的2次方為刪除權(quán)限,2的3次方為更新權(quán)限,則擁有添加與刪除權(quán)限就應(yīng)該為2的1次方+2的2次方=6,其實2的幾次方代表什么含義我們可以另外開個數(shù)據(jù)庫表來配置(或者xml文件)此處我們忽略這些步驟。當(dāng)然如果你的權(quán)限較多,譬如你還希望a這個角色對人員信息表有上傳得權(quán)限,我們可以將將上傳權(quán)限定義為2的4次方,16,16的16進(jìn)制數(shù)為10,記錄在數(shù)據(jù)庫里的形式應(yīng)該為0x10如果a角色擁有添加、刪除、更新、上傳權(quán)限,則a的權(quán)值應(yīng)該為2的1次方+2的2次方+2的3次方+2的4次方=30,用16進(jìn)制來表示就應(yīng)該為0x1E,記錄16進(jìn)制數(shù)據(jù),你不用擔(dān)心位數(shù)不夠。
剩余的就是幾張關(guān)系表了:
人員角色關(guān)系表(T_R_User_Role):
?1
/**//*==============================================================*/
?2
/**//*?Table:?T_R_user_role?????????????????????????????????????????*/
?3
/**//*==============================================================*/
?4
create?table?T_R_user_role?
?5
(
?6
????pk_id????????????????NUMBER?????????????????????????not?null,
?7
????user_id??????????????NUMBER,
?8
????role_id??????????????NUMBER,
?9
????constraint?PK_T_R_USER_ROLE?primary?key?(pk_id)
10
);
11
角色資源關(guān)系表(T_R_Role_Resource)
?1
/**//*==============================================================*/
?2
/**//*?Table:?T_R_role_resource?????????????????????????????????????*/
?3
/**//*==============================================================*/
?4
create?table?T_R_role_resource?
?5
(
?6
????pk_id????????????????NUMBER?????????????????????????not?null,
?7
????role_id??????????????NUMBER,
?8
????res_id???????????????NUMBER,
?9
????constraint?PK_T_R_ROLE_RESOURCE?primary?key?(pk_id)
10
);
11
當(dāng)然如果你不怕麻煩,可以添加進(jìn)去組(group)、系統(tǒng)(system)、組織(organization),建立起一套屬于你自己的完整的權(quán)限解決方案,作為系統(tǒng)無關(guān)的模塊去套用到每個你所架構(gòu)的應(yīng)用中去,那是一件極爽的事情。
連續(xù)劇開始了,暫時擱筆~~