基於位運算的權限控制


原理

在Linux文件系統中,一個用戶對文件或目錄所擁有的權限分為三種:”可讀”、”可寫”和”可執行”,分別用 1 、2 和 4 來表示,它們之間可以任意組合:有“可讀”、“可寫”權限就用 3 來表示(1 + 2 = 3);有”可讀“、”可執行“權限就用5來表示(1 + 4 = 5),三種權限全部擁有就用 7 表示(1 + 2 + 4 = 7)。

實際上,這種運算是基於二進制的。

假設可執行、可寫、可讀三種權限分別對應三個狀態位,如果用戶具有某種權限,那么將對應的狀態位標識為“1”,反之則標識為“0”。如圖:

位運算與權限控制

 

如果只有“可讀”權限,那么就對應二進制數:001,將這個二進制數轉成十進制就得到1;如果同時具有“可讀”、“可寫”權限,二進制數則對應為: 011,轉十進制得:3;同理,三種權限都有的,十進制就等於7。

實現

在PHP中,通過位運算符很容易就可以做到類似的權限控制:

<?php
//定義權限
define('READ', 1<< 0);    // 把可讀權限放在最右邊
define('WRITE', 1<<1);    // 可讀權限向左移一位
define('EXCUTE', 1<<2);   // 可執行權限向左移兩位

//賦予權限
$user_permission = READ | WRITE;

//驗證權限
echo '可讀:', ($user_permission & READ) ? 'Yes' : 'No', "\n";
echo '可寫:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n";
echo '可執行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n";
?>

PHP語言本身的錯誤控制 也是用位運算來做的,它甚至還利用了按位異或按位非,使得錯誤控制更加精確。

優點和缺陷

位運算的運算對象是二進制的位,速度快,效率高,而且節省存儲空間,位運算做權限控制又相當地靈活。但是,位運算也有很大的局限,因為在32位計算機上,位移不能超過32次,這就要求權限數量不超過32種。


延伸閱讀:
  • MySQL的SET類型,也是基於位運算的,恰當的運用,效果不錯,可以參看教程

作者:肖斌
本文鏈接:http://xiaobin.net/200906/bitwise-permission/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM