国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 邏輯算法 > 正文

權(quán)限設(shè)計(jì)及算法(PHPE)

2024-09-08 23:18:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

權(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)! 

posted by: trooman 2005-12-28 16:02
咋個(gè)這么冷清,一個(gè)發(fā)表點(diǎn)意見(jiàn)的都沒(méi)有? 

posted by: axgle 2005-12-28 16:05
已收藏。 

posted by: donyad 2005-12-28 16:41
1 2 3 的思想是相同的,只是實(shí)現(xiàn)上的手法不同而已
而3后半部分樓主的例子,恕偶愚笨,看不懂

3的做法是很c的,driver級(jí)別或者系統(tǒng)級(jí)別的程序很常用
比如*nix下的文件權(quán)限0755 0777之類(lèi)

方法1 跟 方法3 原型是一模一樣的,就是二進(jìn)制位,方法3 是對(duì)這個(gè)的一個(gè)字符串模擬
二進(jìn)制 十進(jìn)制
100 4
+ 1 1
------------
101 5

用相互獨(dú)立的位來(lái)標(biāo)志權(quán)限,就是為了原子性,素?cái)?shù)同樣具有這個(gè)特性
所以派生出2的做法,而分解質(zhì)因數(shù),我并不認(rèn)為這個(gè)會(huì)是一個(gè)問(wèn)題,因?yàn)槿N方法都需要去檢查所需要的權(quán)限
既然是檢查,除一下所需要的質(zhì)數(shù)即可

而3里面所說(shuō)的要變長(zhǎng)的問(wèn)題
1和2正好在概念上回避了這個(gè)問(wèn)題
實(shí)際上,在c里面用二進(jìn)制,有個(gè)對(duì)齊的問(wèn)題,就是要8位8位的申請(qǐng),8位8位的用,無(wú)所謂太長(zhǎng)了浪費(fèi)
只是象方法3這樣用字符串來(lái)模擬二進(jìn)制時(shí)會(huì)有浪費(fèi)
而方法1 2在真正保存時(shí),也是保存成一個(gè)int,也是一個(gè)申請(qǐng)過(guò)來(lái)就那么多位的二進(jìn)制空間,無(wú)所謂浪費(fèi)

擴(kuò)展和彈性上,方法1和方法2是沒(méi)有影響的
對(duì)方法3來(lái)說(shuō)是個(gè)問(wèn)題,那是因?yàn)榉椒?模擬得不好... 方法3感覺(jué)有豬鼻子插蔥之嫌

--------------

敲code多了,文字表達(dá)能力可能不行了,偶說(shuō)不對(duì)的或說(shuō)不清的地方歡迎大家拍磚,3q
 

posted by: lihun21 2005-12-28 19:27
做個(gè)記號(hào)先
學(xué)習(xí)一下
現(xiàn)在還沒(méi)有用到這么深的權(quán)限系統(tǒng)
我現(xiàn)在只有三種權(quán)限的用戶(hù),所以還沒(méi)有考慮那么多
超級(jí)管理員->普通管理員->普通用戶(hù)
我想,我用的是這種模式
用戶(hù)+權(quán)限 

posted by: wwccss 2005-12-28 20:06
樓主的文章不錯(cuò)。donyad兄分析的也很有水平。  

posted by: cozo 2005-12-28 20:10
這種東西只要一種方法就可以了。
我就只使用第一種。 

posted by: bitq 2005-12-28 21:47
這個(gè)方法我有看到過(guò)~~~


用二進(jìn)制表示權(quán)限,不會(huì)互相影響,期待做個(gè)涉及到這個(gè)的項(xiàng)目

高手就是高手~~` 

posted by: binzywu 2005-12-28 22:01
具體怎么標(biāo)記權(quán)限 這個(gè)較無(wú)所謂
一般的系統(tǒng)
rbac是已經(jīng)夠用的.

一般access controller有3種
user based
group based
role based

rbac有成熟的理論基礎(chǔ), 你可以搜索以下, 能搜到很多論文.

但如果不是一般的應(yīng)用系統(tǒng), 那么權(quán)限系統(tǒng)可能設(shè)計(jì)需要較為特別. 這里只有普遍理論, 未必有普遍方法.

 

posted by: terpomo 2005-12-29 00:31
學(xué)習(xí)了 

posted by: bleakwind 2005-12-29 01:14
我比較落后,我是將每個(gè)人的權(quán)限組成的數(shù)組序列化放入數(shù)據(jù)庫(kù)。。。
每次載入頁(yè)面初始化出來(lái)。。。 

posted by: nameless 2005-12-29 08:51
見(jiàn)過(guò)一個(gè)用方法3做的權(quán)限判斷,操作很方便,也很靈活

欄目權(quán)限用的直接把欄目標(biāo)識(shí)用界定符分隔連接,操作時(shí)判斷有沒(méi)有這個(gè)標(biāo)識(shí),簡(jiǎn)單,對(duì)欄目數(shù)過(guò)多且操作員過(guò)多的時(shí)候這個(gè)數(shù)據(jù)庫(kù)效率應(yīng)該不高(如果操作員能超過(guò) 10w 的話(huà)),呵呵 

posted by: trooman 2005-12-29 11:18
quote (nameless @ 2005-12-29 08:51)
見(jiàn)過(guò)一個(gè)用方法3做的權(quán)限判斷,操作很方便,也很靈活

欄目權(quán)限用的直接把欄目標(biāo)識(shí)用界定符分隔連接,操作時(shí)判斷有沒(méi)有這個(gè)標(biāo)識(shí),簡(jiǎn)單,對(duì)欄目數(shù)過(guò)多且操作員過(guò)多的時(shí)候這個(gè)數(shù)據(jù)庫(kù)效率應(yīng)該不高(如果操作員能超過(guò) 10w 的話(huà)),呵呵 

是的,我也認(rèn)為方法3不會(huì)比二進(jìn)制的效率差,在具體使用時(shí)可以用like,str_replace等,還可以模擬二進(jìn)制。

那種所謂的“欄目”權(quán)限管理,現(xiàn)在已經(jīng)過(guò)時(shí)了,但思想還是可以沿用的,如“對(duì)應(yīng)欄目”改成“對(duì)應(yīng)模塊”,但實(shí)現(xiàn)方式已經(jīng)截然不同了! 

posted by: sean.zhuo 2005-12-29 13:51
哪位大哥能給我講解一下"角色"這個(gè)概念嗎?不懂什麼叫角色. 

posted by: knighte 2005-12-29 14:50
1和3,本質(zhì)還是一樣的吧。
1有個(gè)好處,節(jié)省空間。lz提到開(kāi)100個(gè)權(quán)限用來(lái)升級(jí)。不過(guò)我遇到過(guò)一個(gè)超過(guò)100個(gè)權(quán)限類(lèi)別的系統(tǒng),而且用戶(hù)樹(shù)較多。所以后來(lái)壓成了16進(jìn)制存儲(chǔ)(原來(lái)還是一樣),就類(lèi)似1的處理方法了。
不過(guò)3最大的好處應(yīng)該在于直觀(guān)(其實(shí)如果權(quán)限項(xiàng)很多的話(huà),也不直觀(guān)了,呵呵)。

個(gè)人認(rèn)為“權(quán)限儲(chǔ)存和判斷的方法”其實(shí)還不是“權(quán)限設(shè)計(jì)”的重點(diǎn)和難點(diǎn)。我們還需要考慮其他東西。比如權(quán)限的設(shè)計(jì)結(jié)構(gòu)(rbac/gbac/ubac)的選擇,比如權(quán)限在應(yīng)用系統(tǒng)中的使用……

我gbac(基于組的權(quán)限控制)用的比較多。一般的邏輯是:

 

組成樹(shù)型結(jié)構(gòu),用戶(hù)跟組結(jié)點(diǎn)

判斷權(quán)限,從組根目錄開(kāi)始往用戶(hù)所在組進(jìn)行遍歷。起始權(quán)限為“禁止”

遍歷時(shí),子組權(quán)限覆蓋起始權(quán)限,直至用戶(hù)。

最后用戶(hù)權(quán)限覆蓋起始權(quán)限。得到最終權(quán)限碼。


雖然貌似有些繁雜,不過(guò)較靈活些。


其次談?wù)剻?quán)限的使用。通常的做法(至少我是這么做的),即在“所需”時(shí),根據(jù)以上邏輯判斷某用戶(hù)相對(duì)某權(quán)限“是否通過(guò)”,例如(亂寫(xiě)的,只是想表示是在需要是進(jìn)行判斷):
code 

// when someone posts a new topic
if ($access_controller->check($user, 'post'))
{
   // access passed
   $user->post($content);
}
else
{
   // access denied
   $sys->accessdenied();
}
 

 

而我一直很想嘗試的,是這樣一種權(quán)限使用方法:即在$user實(shí)例出來(lái)時(shí),已經(jīng)裝配好他擁有的權(quán)限(check once, run anywhere),例如:
code 

class user
{
   var $sid;
   var $name;
   var $passwd;
   var $email;
   // ...

   function __call()
   {
       // it must be a access denied process here
       die('no permission');
   }

   // maybe no other methods here...
}

// we need overload the user class in php4
// for the __call magic method
overload('user');
$user = new user();

// we need a accessinject method to inject accesses into user object
$access_controller->access_inject($user)
// then, the user object includes its access methods...

// ok, we use the user's method directly
$user->post($content);
// if the user object includes the post method, it has the right permission...
 

 

隨便寫(xiě)了點(diǎn),沒(méi)有很仔細(xì)考慮結(jié)構(gòu)和命名,希望能表達(dá)清楚我的意思。
拋磚引玉…… 

posted by: luciferstar 2005-12-29 17:40
做過(guò)一個(gè)表單,用法1和3保存多選的表單數(shù)據(jù)。 

posted by: james.liu 2006-01-05 17:10
如果是面向?qū)ο蟮模瑑A向于小k的想法

用戶(hù)登陸時(shí),,如果用戶(hù)名,密碼,什么都對(duì)的,允許他登陸時(shí),,實(shí)例化用戶(hù)信息,包括權(quán)限 

posted by: gudai 2006-01-11 16:06
權(quán)限設(shè)計(jì)。頭疼的問(wèn)題。 

 


         來(lái)源:http://club.phpe.net/index.php?act=print&client=printer&f=2&t=11828

 

 

 

菜鳥(niǎo)學(xué)堂:
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 措美县| 巨鹿县| 渭南市| 甘洛县| 砚山县| 荆门市| 民权县| 和平县| 绵竹市| 西青区| 揭东县| 汤原县| 高台县| 金川县| 鹤峰县| 历史| 大冶市| 辽阳县| 镇远县| 遂昌县| 丹巴县| 犍为县| 芜湖市| 三原县| 河北省| 平顶山市| 辉南县| 平陆县| 清原| 电白县| 武山县| 昌吉市| 遂平县| 会理县| 丹巴县| 无锡市| 基隆市| 綦江县| 平果县| 宁国市| 莎车县|