基於原生PHP交叉會員權限控制

對於一個網站的後臺管理系統,單一的超級管理員權限往往不能滿足我們的需求,尤其是對於大型網站而言,這種單一的權限會引發許許多多的問題出現。

 

比如:一個網站編輯,平時他隻是負責公司網站的公告更新,但如果網站後臺沒有嚴格的權限限制,他是不是就可以操作到客戶的一些信息,這是存在很大隱患的。

 

如果學過ThinkPHP框架的朋友一定知道有個東西叫RBAC,今天咱不說那個,來說說在原生PHP語言中,怎麼實現交叉權限控制。

 

好瞭,話不多說,老樣子,直接說原理,上代碼。

 

 

 

 

 

對於權限的交叉控制可以有很多種方法實現,這裡隻是提供一種思路:(我采用的是二進制數的方法)

 

一、這裡先提下按位與和按位或的運算方法:

 

1、按位與運算符(&)

 

參加運算的兩個數據,按二進制位進行“與”運算。(“與”運算=>是否有包含的值如:7&8=0)

 

 

 

運算規則: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、按位或運算符(|)

 

 

 

參加運算的兩個對象,按二進制位進行“或”運算。(“或”運算=>能包含的值如:7=4|2|1,用“異或”去除包含如:7^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。 

 

 

 

 

 

 

 

另,負數按補碼形式參加按位或運算。

 

 

 

瞭解瞭按位與和按位或的運算,我們來看下面這個例子:

 

復制代碼

 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;//1101

10     $user=SELECT;//1000

11 ?>

復制代碼

我把增刪改查分別做成瞭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() 范例

<?php

echo decbin(12) . "\n";

echo decbin(26);

?>  

 

上例將輸出:

1100

11010

參見 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,沒有權限為0

10     $admin=ADD|DELETE|UPDATE|SELECT;//1111 15

11     $editor=ADD|UPDATE|SELECT;//1101 13

12     $user=SELECT;//1000 8

13 

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

 

那麼我們隻要對它們進行按位與運算就可以判斷是否具備權限瞭

 

例如:(從後往前看)  取十進制(伺服器存儲類型值)轉二進制進行"與"運算 

 

網站編輯權限 0000 1101(權限十進制為13) & 0000 0010(刪除權限十進制為2轉二進制為10)  結果:0000 0000 也就是沒有具備權限

 

再來試試

 

普通用戶權限 0000 1000 & 0000 0001(添加權限十進制為1二進制為1)  結果:0000 0000 也一樣不具備權限

 

超級管理員權限0000 1111 & 0000 1101(網站編輯的權限)  結果:0000 1101 也就是具備瞭網站編輯的權限

 

 

 

好瞭看具體實例吧

 

 

 

我建瞭一個伺服器,裡面有2張表

 

一張是user用戶表:

 

 

 

gid代表權限表的組id

 

 

 

 

 

一張是權限表:

 

 

 

flag代表增刪改查的權限,可根據自己需要定義

 

 

 

 

 

基本配置頁面: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);//二進制1

14     define('DELETE',2);//二進制10

15     define('UPDATE',4);//二進制100

16     define('SELECT',8);//二進制1000

17 

18     //有權限為1,沒有權限為0

19     $admin=ADD|DELETE|UPDATE|SELECT;//1111

20     $editor=ADD|UPDATE|SELECT;//1101

21     $user=SELECT;//1000

22 ?>

復制代碼

 

 

登陸首頁:index.html

 

復制代碼

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 2 <html xmlns="https://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         //此處判斷的是 是否具備刪除權限 如:user伺服器存儲的值為8轉二進制為1000 刪除權限的值為2轉二進制為0010 與運算0000 無權限

15         if($data['flag']&DELETE){

16             echo "你有刪除權限";

17         }else{

18             echo "你沒有刪除權限";

19         }

20 

21     }else{

22         echo "錯誤賬號密碼";

23     }

24     

25 

26 ?>

發佈留言