對于一個網站的后臺管理系統,單一的超級管理員權限往往不能滿足我們的需求,尤其是對于大型網站而言,這種單一的權限會引發許許多多的問題出現。
比如:一個網站編輯,平時他只是負責公司網站的公告更新,但如果網站后臺沒有嚴格的權限限制,他是不是就可以操作到客戶的一些信息,這是存在很大隱患的。
如果學過Thinkhtml' target='_blank'>PHP框架的朋友一定知道有個東西叫RBAC,今天咱不說那個,來說說在原生PHP語言中,怎么實現交叉權限控制。
好了,話不多說,老樣子,直接說原理,上代碼。
對于權限的交叉控制可以有很多種方法實現,這里只是提供一種思路:(我采用的是二進制數的方法)
一、這里先提下按位與和按位或的運算方法:
1、按位與運算符(&)參加運算的兩個數據,按二進制位進行“與”運算。
運算規則:0&0=0;0&1=0;1&0=0;1&1=1;
即:兩位同時為“1”,結果才為“1”,否則為0
例如:3&5即 0000 0011& 0000 0101 = 0000 0001因此,3&5的值得1。
另,負數按補碼形式參加按位與運算。
2、按位或運算符(|)參加運算的兩個對象,按二進制位進行“或”運算。
運算規則:0|0=0; 0|1=1;1|0=1;1|1=1;
即 :參加運算的兩個對象只要有一個為1,其值為1。
例如:3|5 即 0000 0011| 0000 0101 = 0000 0111因此,3|5的值得7?!?/p>
另,負數按補碼形式參加按位或運算。
了解了按位與和按位或的運算,我們來看下面這個例子:
1 <?php 2 define('ADD',1);//二進制1 3 define('DELETE',2);//二進制10 4 define('UPDATE',4);//二進制100 5 define('SELECT',8);//二進制1000 6 7 //有權限為1,沒有權限為0 8 $admin=ADD|DELETE|UPDATE|SELECT;//1111 9 $editor=ADD|UPDATE|SELECT;//110110 $user=SELECT;//100011 ?>
我把增刪改查分別做成了4個權限并定為常量
1的二進制數是1,2的二進制數是10,4的二進制數是100,8的二進制數是1000,這里剛好成一個規律
可能有些朋友會問上面權限變量admin,editor,user所對應的1111,1101,1000是怎么來的?
PHP里有一個十進制數轉二進制數的函數叫decbin()
下面是對應的函數解釋:
decbin(PHP 3, PHP 4, PHP 5)decbin -- 十進制轉換為二進制說明string decbin ( int number )
返回一字符串,包含有給定 number 參數的二進制表示。所能轉換的最大數值為十進制的 4294967295,其結果為 32 個 1 的字符串。 例子 1. decbin() 范例<?phpecho decbin(12) . "/n";echo decbin(26);?> 上例將輸出:110011010參見 bindec(),decoct(),dechex() 和 base_convert()。
我們來測試輸出看看吧:
1 <?php 2 3 4 define('ADD',1);//二進制1 5 define('DELETE',2);//二進制10 6 define('UPDATE',4);//二進制100 7 define('SELECT',8);//二進制1000 8 9 //有權限為1,沒有權限為010 $admin=ADD|DELETE|UPDATE|SELECT;//111111 $editor=ADD|UPDATE|SELECT;//110112 $user=SELECT;//100013 14 echo decbin($admin)."<br/>";15 echo decbin($editor)."<br/>";16 echo decbin($user)."<br/>";17 18 19 ?>
輸出結果:
那么我們就可以運用這個運算來判斷權限了,1代表有權限,0代表無權限
比如:
admin(超級管理員)擁有的權限是增刪改查也就是1111——>0000 1111
editor(網站編輯)擁有的權限是增,改,查也就是1101——>0000 1101
user(普通用戶)只擁有瀏覽、查詢的權限也就是1000——>0000 1000
那么我們只穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq21Mv8w8e9+NDQsLTOu9Pr1MvL477Nv8nS1MXQts/Kx7fxvt+xuMioz97ByzwvcD4KPHA+wP3I56O6PC9wPgo8cD7N+NW+seC8rcioz94gMDAwMCAxMTAxIA==" 0000 0010(刪除權限十進制為2轉二進制為10) 結果:0000 0000 也就是沒有具備權限
再來試試
普通用戶權限 0000 1000 |0000 0001(添加權限十進制為1二進制為1) 結果:0000 0000 也一樣不具備權限
超級管理員權限0000 1111 |0000 1101(網站編輯的權限) 結果:0000 1111 也就是具備了網站編輯的權限
好了看具體實例吧
我建了一個數據庫,里面有2張表
一張是user用戶表:
gid代表權限表的組id
一張是權限表:
flag代表增刪改查的權限,可根據自己需穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq2qNLlPC9wPgo8cD48aW1nIHNyYz0="http://www.it165.net/uploadfile/files/2014/0807/2014080720012574.jpg" alt="" />
基本配置頁面:config.php
1 <?php 2 3 define('HOST','localhost'); 4 define('DBNAME','member'); 5 define('USER', 'root'); 6 define('PASS', ''); 7 8 9 $link=@mysql_connect(HOST,USER,PASS) or die('數據庫連接失敗');10 11 mysql_select_db(DBNAME,$link);12 13 define('ADD',1);//二進制114 define('DELETE',2);//二進制1015 define('UPDATE',4);//二進制10016 define('SELECT',8);//二進制100017 18 //有權限為1,沒有權限為019 $admin=ADD|DELETE|UPDATE|SELECT;//111120 $editor=ADD|UPDATE|SELECT;//110121 $user=SELECT;//100022 ?>
登陸首頁:index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <form action="action.php" method="post"> 9 賬號:<input type="text" name="username" />10 密碼:<input type="password" name="password" />11 <input type="submit" name="submit" value="登陸"> 12 </form> 13 </body>14 </html>
提交頁面:action.php
1 <?php 2 3 require_once('config.php'); 4 $username=$_POST['username']; 5 $password=$_POST['password']; 6 7 8 $sql="select * from user as a,role as b where a.gid=b.gid 9 and a.username='$username' and password='$password'";10 11 $result=mysql_query($sql);12 if($data=mysql_fetch_array($result)){13 //賬號驗證通過,判斷對應權限14 //此處判斷的是 是否具備刪除權限15 if($data['flag']&DELETE){16 echo "你有刪除權限";17 }else{18 echo "你沒有刪除權限";19 }20 21 }else{22 echo "錯誤賬號密碼";23 }24 25 26 ?>
效果圖如下:
輕松搞定~
這里只是個簡單的小DEMO演示,希望能起到拋磚引玉的作用,至于具體項目還需具體分析,權限控制畢竟是個很復雜的功能。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答