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

首頁 > 編程 > PHP > 正文

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

2020-03-22 18:23:56
字體:
來源:轉載
供稿:網友
  • 對于一個網站的后臺管理系統,單一的超級管理員權限往往不能滿足我們的需求,尤其是對于大型網站而言,這種單一的權限會引發許許多多的問題出現。

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

    如果學過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編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 桦南县| 东丽区| 吴江市| 简阳市| 宝丰县| 徐汇区| 城固县| 大埔区| 洛南县| 尚志市| 吉首市| 若羌县| 台前县| 彩票| 广南县| 赤峰市| 赤城县| 略阳县| 聂荣县| 图木舒克市| 福泉市| 宾阳县| 银川市| 明溪县| 呼伦贝尔市| 鞍山市| 济阳县| 余江县| 仁怀市| 海安县| 库尔勒市| 旅游| 阿拉尔市| 祁门县| 元朗区| 横峰县| 平果县| 洛隆县| 梁山县| 宁强县| 遵化市|