原理
在Linux文件系統(tǒng)中,一個(gè)用戶對文件或目錄所擁有的權(quán)限分為三種:”可讀”、”可寫”和”可執(zhí)行”,分別用 1 、2 和 4 來表示,它們之間可以任意組合:有“可讀”、“可寫”權(quán)限就用 3 來表示(1 + 2 = 3);有”可讀“、”可執(zhí)行“權(quán)限就用5來表示(1 + 4 = 5),三種權(quán)限全部擁有就用 7 表示(1 + 2 + 4 = 7)。
?
實(shí)際上,這種運(yùn)算是基于二進(jìn)制的。假設(shè)可執(zhí)行、可寫、可讀三種權(quán)限分別對應(yīng)三個(gè)狀態(tài)位,如果用戶具有某種權(quán)限,那么將對應(yīng)的狀態(tài)位標(biāo)識為“1”,反之則標(biāo)識為“0”。如圖:
?
如果只有“可讀”權(quán)限,那么就對應(yīng)二進(jìn)制數(shù):001,將這個(gè)二進(jìn)制數(shù)轉(zhuǎn)成十進(jìn)制就得到1;如果同時(shí)具有“可讀”、“可寫”權(quán)限,二進(jìn)制數(shù)則對應(yīng)為: 011,轉(zhuǎn)十進(jìn)制得:3;同理,三種權(quán)限都有的,十進(jìn)制就等于7。
?
實(shí)現(xiàn)
在PHP中,通過 位運(yùn)算符 很容易就可以做到類似的權(quán)限控制:
<?php //定義權(quán)限 define('READ', 1<< 0); // 把可讀權(quán)限放在最右邊 define('WRITE', 1<<1); // 可讀權(quán)限向左移一位 define('EXCUTE', 1<<2); // 可執(zhí)行權(quán)限向左移兩位 //賦予權(quán)限 $user_permission = READ | WRITE; //驗(yàn)證權(quán)限 echo '可讀:', ($user_permission & READ) ? 'Yes' : 'No', "\n"; echo '可寫:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n"; echo '可執(zhí)行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n"; ?>?
PHP語言本身的 錯(cuò)誤控制 也是用位運(yùn)算來做的,它甚至還利用了 按位異或 和 按位非 ,使得錯(cuò)誤控制更加精確。
?
優(yōu)點(diǎn)和缺陷
位運(yùn)算的運(yùn)算對象是二進(jìn)制的位,速度快,效率高,而且節(jié)省存儲空間,位運(yùn)算做權(quán)限控制又相當(dāng)?shù)仂`活。但是,位運(yùn)算也有很大的局限,因?yàn)樵?2位計(jì)算機(jī)上,位移不能超過32次,這就要求權(quán)限數(shù)量不超過32種。
?
來源: http://xiaobin.net/200906/bitwise-permission/
?
?
位運(yùn)算 就是把數(shù)值轉(zhuǎn)化成二進(jìn)制數(shù)來進(jìn)行運(yùn)算,常用的位運(yùn)算符詳下表:
?
位運(yùn)算符 例子 名稱 結(jié)果$a & $b | And(按位與) | 將把 $a 和 $b 中都為 1 的位設(shè)為 1。 |
$a | $b | Or(按位或) | 將把 $a 或者 $b 中為 1 的位設(shè)為 1。 |
$a ^ $b | Xor(按位異或) | 將把 $a 和 $b 中不同的位設(shè)為 1。 |
~ $a | Not(按位非) | 將 $a 中為 0 的位設(shè)為 1,反之亦然。 |
$a << $b | Shift left(左移) | 將 $a 中的位向左移動(dòng) $b 次(每一次移動(dòng)都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 將 $a 中的位向右移動(dòng) $b 次(每一次移動(dòng)都表示“除以 2”)。 |
?
<?php $a=12; /* 轉(zhuǎn)化為二進(jìn)制數(shù)為1100 */ $b=9; /* 轉(zhuǎn)化為二進(jìn)制數(shù)為1001 */ $c=2; echo "a=$a b=$b c=$c"; echo "<br>$a & $b ="; echo $a & $b; echo "<br>$a | $b ="; echo $a | $b; echo "<br>$a<<$c="; echo $a<<$c; ?>
?
預(yù)覽:
?
ps:用十進(jìn)制數(shù)除以2得余數(shù),繼續(xù)除每次都是取余數(shù),所得的是從低位到高位的二進(jìn)制數(shù)。
如:12/2=6 (余數(shù)0) 6/2=3(余數(shù)0) 3/2=1(余數(shù)1) 1/2=1(余數(shù)1)
即:1100。
二進(jìn)制轉(zhuǎn)換成十進(jìn)制,分別用每一位的數(shù)字×對應(yīng)的2的不同次冪。
1100即 2 0 x0+2 1 x0+2 2 x1=2 3 x1=12
?
來源: http://www.web589.com/posts/575.html
?
原理: 將每個(gè)二進(jìn)制位為一個(gè)權(quán)限標(biāo)識位
- 增加權(quán)限使用 | (無論存在與否, 將對應(yīng)的權(quán)限位置1)
- 刪除權(quán)限使用 ^ 或 & ~ (無論存在與否, 將對應(yīng)的權(quán)限位置0)
- 判斷權(quán)限使用 & ? (使用與判斷對應(yīng)的權(quán)限位是否為1, 是, 返回非0; 不是, 返回0)
<?php define("PUBLIC_ARTICLE", 1); //發(fā)行文章 define("CREATE_ARTICLE", 2); //添加文章 define("MODIFY_ARTICLE", 4); //修改文章 define("DELETE_ARTICLE", 8); //刪除文章 define("SHARCH_ARTICLE", 16); //搜索文章 define("CREATE_COMMENT", 32); //添加文章評論 define("DELETE_COMMENT", 64); //刪除文章評論 //所有的權(quán)限 $final_allow = PUBLIC_ARTICLE | CREATE_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE | SHARCH_ARTICLE | CREATE_COMMENT | DELETE_COMMENT; echo "管理者擁有的全部權(quán)限:" .decbin($final_allow). "<br>"; $no_shearch_allow = $final_allow ^ SHARCH_ARTICLE; echo "僅無法搜索文章的權(quán)限:" .decbin($no_shearch_allow). "<br>"; //編輯人員獨(dú)有的權(quán)限 $editor_allow = PUBLIC_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE; $no_editor_allow = $final_allow & ~$editor_allow; echo "非編輯人員所有的權(quán)限:" .decbin($no_editor_allow). "<br>"; ?>?
最終輸出為:
管理者擁有的全部權(quán)限:1111111
僅無法搜索文章的權(quán)限:1101111
非編輯人員所有的權(quán)限:1110010
?
另外可以參看:
<?php echo $uu=array_sum($_POST[gr]); ?> <form action="" method="POST"> ADD <input type="checkbox" name=gr[] value=1 <?php echo $uu&1? "checked":null;?>> UPD <input type="checkbox" name=gr[] value=2 <?php echo $uu&2? "checked":null;?>> LIS <input type="checkbox" name=gr[] value=4 <?php echo $uu&4? "checked":null;?>> DEL <input type="checkbox" name=gr[] value=8 <?php echo $uu&8? "checked":null;?>> <input type="submit" value="提交"> </form> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />?
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
