天天看點

權限設計

大概有這幾種模式:

使用者+組+角色+權限

使用者+組+權限

使用者+角色+權限

使用者+權限

最近看了别人的設計方法,大多以“整數”來表示權限值,如添加、浏覽、删除和修改,分别用1、2、4、8這幾個整數來代替,不過,各人的做法有所不同,舉例如下:

1.用2的n次幂組成權限值的集合,如1、2、4、8、16...,某使用者的權限值為其子集中的整數之和,如 7=1+2+4,5=1+4。如果要從資料庫檢索包含某幾種權限的使用者,則先把這幾種權限值相加,假設和為k,然後select * from table where 1 and 使用者權限值 = 'k';如果要判斷某使用者有哪些權限,則取出其權限值k,分别用k&1,K&2,K&4,k&16...,如果為真,則表示有值等于“&”右邊整數的權限,例如,如果k&4為真,則此使用者有權限表中值等于4的權限;

2.用質數2、3、5、7、11...組成權限集合,某使用者的權限為其子集中各整數的乘積,如 210 = 2*3*5*7,我覺得這種方法很有趣,難點在于如何分解質因數;但我有些不認同原作者的提法,他認為權限之間可能存在包含關系,如某使用者有删除權限,則其一定有浏覽權限,要不然就沒法删除,事實确實是這樣,不過我認為這樣太複雜了,容易出錯,我覺得權限最好是“原子”的,互不幹擾,也就是說某使用者有删除權限而沒浏覽權限則其無法進行删除操作,因為他看不到東西,解決這個沖突的關鍵是在給使用者賦權時,把浏覽權限也賦給他;

3.不用整數,而是用“向量表”方法(也許我說的不一定對),把所有可能的權限按一定的順序排列,如添加、浏覽、修改、删除...,使用者的權限值為固定100位長度的字元串,如100010100001....01,從左起每一位對應一種操作權限,如果有這種權限,則此位的值為1,反之,則為0,作者之是以把使用者權限值固定為100位,我想是考慮到更新問題,但我認為這還不夠科學,我認為使用者的權限值長度應小于權限個數,舉例如下:

權限排清單:添加、浏覽、修改、删除,使用者A有添加和浏覽的的權限,則其權限值為11,使用者B有浏覽和修改的權限則其權限值為011,使用者C有浏覽和删除的權限則其權限值為0101,這樣設計的好處為:當權限表中增加别的權限時,不會影響使用者表或角色表;

4.我曾經的做法,在背景管理中把權限分為兩大類:欄目權限和操作權限,每個欄目對應一個目錄,操作權限細分為浏覽、添加、修改和删除,使用者進入系統後首先判斷有沒有欄目權限,然後判斷有沒有操作權限,判斷欄目權限相對簡單一些,首先擷取通路頁面的路徑path,然後分解出目錄,對應使用者擁有的目錄權限,如果此目錄包含在使用者有權管理的目錄數組中(從資料庫取出),則其有進入此目錄的權限,否則,沒有,然而,在判斷操作權限好象有些麻煩,但突然想到添加、浏覽、修改和删除與我的檔案命名規則是基本是對應的,但有點不同的是,我把添加和删除的功能合并在一個檔案中了,例如檔案名為proAddEdit.aspx,幸好意識到修改檔案時多了個傳遞參數id,于是,我用正則解決了這個問題,今天看來,這種方法似乎過時了,因為不适應面向對象的思想和用架構體系來開發系統!

以上是個人粗淺的認識和描述,若有錯誤,請各位指正,希望高人給些意見!