php下的權(quán)限算法的實(shí)現(xiàn)
更新時(shí)間:2007年04月28日 00:00:00 作者:
權(quán)限設(shè)計(jì)
大概有這幾種模式:
用戶(hù)+組+角色+權(quán)限
用戶(hù)+組+權(quán)限
用戶(hù)+角色+權(quán)限
用戶(hù)+權(quán)限
最近看了別人的設(shè)計(jì)方法,大多以“整數(shù)”來(lái)表示權(quán)限值,如添加、瀏覽、刪除和修改,分別用1、2、4、8這幾個(gè)整數(shù)來(lái)代替,不過(guò),各人的做法有所不同,舉例如下:
1.用2的n次冪組成權(quán)限值的集合,如1、2、4、8、16...,某用戶(hù)的權(quán)限值為其子集中的整數(shù)之和,如 7=1+2+4,5=1+4。如果要從數(shù)據(jù)庫(kù)檢索包含某幾種權(quán)限的用戶(hù),則先把這幾種權(quán)限值相加,假設(shè)和為k,然后select * from table where 1 and 用戶(hù)權(quán)限值 = k;如果要判斷某用戶(hù)有哪些權(quán)限,則取出其權(quán)限值k,分別用k&1,K&2,K&4,k&16...,如果為真,則表示有值等于“&”右邊整數(shù)的權(quán)限,例如,如果k&4為真,則此用戶(hù)有權(quán)限表中值等于4的權(quán)限;
2.用質(zhì)數(shù)2、3、5、7、11...組成權(quán)限集合,某用戶(hù)的權(quán)限為其子集中各整數(shù)的乘積,如 210 = 2*3*5*7,我覺(jué)得這種方法很有趣,難點(diǎn)在于如何分解質(zhì)因數(shù);但我有些不認(rèn)同原作者的提法,他認(rèn)為權(quán)限之間可能存在包含關(guān)系,如某用戶(hù)有刪除權(quán)限,則其一定有瀏覽權(quán)限,要不然就沒(méi)法刪除,事實(shí)確實(shí)是這樣,不過(guò)我認(rèn)為這樣太復(fù)雜了,容易出錯(cuò),我覺(jué)得權(quán)限最好是“原子”的,互不干擾,也就是說(shuō)某用戶(hù)有刪除權(quán)限而沒(méi)瀏覽權(quán)限則其無(wú)法進(jìn)行刪除操作,因?yàn)樗床坏綎|西,解決這個(gè)矛盾的關(guān)鍵是在給用戶(hù)賦權(quán)時(shí),把瀏覽權(quán)限也賦給他;
3.不用整數(shù),而是用“向量表”方法(也許我說(shuō)的不一定對(duì)),把所有可能的權(quán)限按一定的順序排列,如添加、瀏覽、修改、刪除...,用戶(hù)的權(quán)限值為固定100位長(zhǎng)度的字符串,如100010100001....01,從左起每一位對(duì)應(yīng)一種操作權(quán)限,如果有這種權(quán)限,則此位的值為1,反之,則為0,作者之所以把用戶(hù)權(quán)限值固定為100位,我想是考慮到升級(jí)問(wèn)題,但我認(rèn)為這還不夠科學(xué),我認(rèn)為用戶(hù)的權(quán)限值長(zhǎng)度應(yīng)小于權(quán)限個(gè)數(shù),舉例如下:
權(quán)限排列表:添加、瀏覽、修改、刪除,用戶(hù)A有添加和瀏覽的的權(quán)限,則其權(quán)限值為11,用戶(hù)B有瀏覽和修改的權(quán)限則其權(quán)限值為011,用戶(hù)C有瀏覽和刪除的權(quán)限則其權(quán)限值為0101,這樣設(shè)計(jì)的好處為:當(dāng)權(quán)限表中增加別的權(quán)限時(shí),不會(huì)影響用戶(hù)表或角色表;
4.我曾經(jīng)的做法,在后臺(tái)管理中把權(quán)限分為兩大類(lèi):欄目權(quán)限和操作權(quán)限,每個(gè)欄目對(duì)應(yīng)一個(gè)目錄,操作權(quán)限細(xì)分為瀏覽、添加、修改和刪除,用戶(hù)進(jìn)入系統(tǒng)后首先判斷有沒(méi)有欄目權(quán)限,然后判斷有沒(méi)有操作權(quán)限,判斷欄目權(quán)限相對(duì)簡(jiǎn)單一些,首先獲取訪(fǎng)問(wèn)頁(yè)面的路徑path,然后分解出目錄,對(duì)應(yīng)用戶(hù)擁有的目錄權(quán)限,如果此目錄包含在用戶(hù)有權(quán)管理的目錄數(shù)組中(從數(shù)據(jù)庫(kù)取出),則其有進(jìn)入此目錄的權(quán)限,否則,沒(méi)有,然而,在判斷操作權(quán)限好象有些麻煩,但突然想到添加、瀏覽、修改和刪除與我的文件命名規(guī)則是基本是對(duì)應(yīng)的,但有點(diǎn)不同的是,我把添加和刪除的功能合并在一個(gè)文件中了,例如文件名為proAddEdit.php,幸好意識(shí)到修改文件時(shí)多了個(gè)傳遞參數(shù)id,于是,我用正則解決了這個(gè)問(wèn)題,今天看來(lái),這種方法似乎過(guò)時(shí)了,因?yàn)椴贿m應(yīng)面向?qū)ο蟮乃枷牒陀每蚣荏w系來(lái)開(kāi)發(fā)系統(tǒng)!
以上是個(gè)人粗淺的認(rèn)識(shí)和描述,若有錯(cuò)誤,請(qǐng)各位指正,希望高人給些意見(jiàn)!
大概有這幾種模式:
用戶(hù)+組+角色+權(quán)限
用戶(hù)+組+權(quán)限
用戶(hù)+角色+權(quán)限
用戶(hù)+權(quán)限
最近看了別人的設(shè)計(jì)方法,大多以“整數(shù)”來(lái)表示權(quán)限值,如添加、瀏覽、刪除和修改,分別用1、2、4、8這幾個(gè)整數(shù)來(lái)代替,不過(guò),各人的做法有所不同,舉例如下:
1.用2的n次冪組成權(quán)限值的集合,如1、2、4、8、16...,某用戶(hù)的權(quán)限值為其子集中的整數(shù)之和,如 7=1+2+4,5=1+4。如果要從數(shù)據(jù)庫(kù)檢索包含某幾種權(quán)限的用戶(hù),則先把這幾種權(quán)限值相加,假設(shè)和為k,然后select * from table where 1 and 用戶(hù)權(quán)限值 = k;如果要判斷某用戶(hù)有哪些權(quán)限,則取出其權(quán)限值k,分別用k&1,K&2,K&4,k&16...,如果為真,則表示有值等于“&”右邊整數(shù)的權(quán)限,例如,如果k&4為真,則此用戶(hù)有權(quán)限表中值等于4的權(quán)限;
2.用質(zhì)數(shù)2、3、5、7、11...組成權(quán)限集合,某用戶(hù)的權(quán)限為其子集中各整數(shù)的乘積,如 210 = 2*3*5*7,我覺(jué)得這種方法很有趣,難點(diǎn)在于如何分解質(zhì)因數(shù);但我有些不認(rèn)同原作者的提法,他認(rèn)為權(quán)限之間可能存在包含關(guān)系,如某用戶(hù)有刪除權(quán)限,則其一定有瀏覽權(quán)限,要不然就沒(méi)法刪除,事實(shí)確實(shí)是這樣,不過(guò)我認(rèn)為這樣太復(fù)雜了,容易出錯(cuò),我覺(jué)得權(quán)限最好是“原子”的,互不干擾,也就是說(shuō)某用戶(hù)有刪除權(quán)限而沒(méi)瀏覽權(quán)限則其無(wú)法進(jìn)行刪除操作,因?yàn)樗床坏綎|西,解決這個(gè)矛盾的關(guān)鍵是在給用戶(hù)賦權(quán)時(shí),把瀏覽權(quán)限也賦給他;
3.不用整數(shù),而是用“向量表”方法(也許我說(shuō)的不一定對(duì)),把所有可能的權(quán)限按一定的順序排列,如添加、瀏覽、修改、刪除...,用戶(hù)的權(quán)限值為固定100位長(zhǎng)度的字符串,如100010100001....01,從左起每一位對(duì)應(yīng)一種操作權(quán)限,如果有這種權(quán)限,則此位的值為1,反之,則為0,作者之所以把用戶(hù)權(quán)限值固定為100位,我想是考慮到升級(jí)問(wèn)題,但我認(rèn)為這還不夠科學(xué),我認(rèn)為用戶(hù)的權(quán)限值長(zhǎng)度應(yīng)小于權(quán)限個(gè)數(shù),舉例如下:
權(quán)限排列表:添加、瀏覽、修改、刪除,用戶(hù)A有添加和瀏覽的的權(quán)限,則其權(quán)限值為11,用戶(hù)B有瀏覽和修改的權(quán)限則其權(quán)限值為011,用戶(hù)C有瀏覽和刪除的權(quán)限則其權(quán)限值為0101,這樣設(shè)計(jì)的好處為:當(dāng)權(quán)限表中增加別的權(quán)限時(shí),不會(huì)影響用戶(hù)表或角色表;
4.我曾經(jīng)的做法,在后臺(tái)管理中把權(quán)限分為兩大類(lèi):欄目權(quán)限和操作權(quán)限,每個(gè)欄目對(duì)應(yīng)一個(gè)目錄,操作權(quán)限細(xì)分為瀏覽、添加、修改和刪除,用戶(hù)進(jìn)入系統(tǒng)后首先判斷有沒(méi)有欄目權(quán)限,然后判斷有沒(méi)有操作權(quán)限,判斷欄目權(quán)限相對(duì)簡(jiǎn)單一些,首先獲取訪(fǎng)問(wèn)頁(yè)面的路徑path,然后分解出目錄,對(duì)應(yīng)用戶(hù)擁有的目錄權(quán)限,如果此目錄包含在用戶(hù)有權(quán)管理的目錄數(shù)組中(從數(shù)據(jù)庫(kù)取出),則其有進(jìn)入此目錄的權(quán)限,否則,沒(méi)有,然而,在判斷操作權(quán)限好象有些麻煩,但突然想到添加、瀏覽、修改和刪除與我的文件命名規(guī)則是基本是對(duì)應(yīng)的,但有點(diǎn)不同的是,我把添加和刪除的功能合并在一個(gè)文件中了,例如文件名為proAddEdit.php,幸好意識(shí)到修改文件時(shí)多了個(gè)傳遞參數(shù)id,于是,我用正則解決了這個(gè)問(wèn)題,今天看來(lái),這種方法似乎過(guò)時(shí)了,因?yàn)椴贿m應(yīng)面向?qū)ο蟮乃枷牒陀每蚣荏w系來(lái)開(kāi)發(fā)系統(tǒng)!
以上是個(gè)人粗淺的認(rèn)識(shí)和描述,若有錯(cuò)誤,請(qǐng)各位指正,希望高人給些意見(jiàn)!
相關(guān)文章
PHP7.1實(shí)現(xiàn)的AES與RSA加密操作示例
這篇文章主要介紹了PHP7.1實(shí)現(xiàn)的AES與RSA加密操作,結(jié)合實(shí)例形式分析了php7.1環(huán)境下AES與RSA加密、解密操作相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2018-06-06php檢查日期函數(shù)checkdate用法實(shí)例
這篇文章主要介紹了php檢查日期函數(shù)checkdate用法,實(shí)例分析了php中checkdate函數(shù)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03ThinkPHP3.2.3所有的單字母方法整理總結(jié)
ThinkPHP3.2.3在以前是一款廣受歡迎的PHP開(kāi)發(fā)框架,現(xiàn)在雖然除了版本5和6,但仍有不少項(xiàng)目使用ThinkPHP3。ThinkPHP3中的字母函數(shù)是以字母開(kāi)頭的一類(lèi)函數(shù),其作用是非常豐富的,包括字符串處理、文件處理、日期時(shí)間處理以及HTTP協(xié)議處理等。2023-07-07比較discuz和ecshop的截取字符串函數(shù)php版
網(wǎng)上看到一篇文章 discuz和ecshop截取字符串的兩個(gè)函數(shù),比較了一下兩個(gè)版本的函數(shù),都各有局限,只能在特定的前提下使用,但是學(xué)習(xí)一下有利于拓寬思路,了解PHP的擴(kuò)展功能2012-09-09PHP回調(diào)函數(shù)概念與用法實(shí)例分析
這篇文章主要介紹了PHP回調(diào)函數(shù)概念與用法,簡(jiǎn)單介紹了回調(diào)函數(shù)的概念、原理,并結(jié)合實(shí)例形式分析了回調(diào)函數(shù)的相關(guān)使用技巧,需要的朋友可以參考下2017-11-11屏蔽PHP默認(rèn)設(shè)置中的Notice警告的方法
很多時(shí)候其實(shí)寫(xiě)出來(lái)的代碼的錯(cuò)誤可以忽略或者根本就不是錯(cuò)誤,PHP還是會(huì)顯示Notice警告,well接下來(lái)我們就來(lái)介紹一下屏蔽PHP默認(rèn)設(shè)置中的Notice警告的方法2016-05-05php創(chuàng)建多級(jí)目錄與級(jí)聯(lián)刪除文件的方法示例
這篇文章主要介紹了php創(chuàng)建多級(jí)目錄與級(jí)聯(lián)刪除文件的方法,結(jié)合實(shí)例形式分析了php使用mkdir創(chuàng)建多級(jí)目錄與unlink結(jié)合rmdir遞歸刪除多級(jí)目錄相關(guān)操作技巧,需要的朋友可以參考下2019-09-09