本文主要和大家分享PHP的RBAC許可權詳解,希望能協助到大家,首先我們應該Crowdsourced Security Testing道許可權管理要有哪些功能:
(1)、使用者只能訪問,指定的控制器,指定的方法
(2)、使用者可以存在於多個使用者組裡
(3)、使用者組可以選擇,指定的控制器,指定的方法
(4)、可以添加控制器和方法
RBAC(Role-Based Access Control,角色型存取控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有若干角色,每一個角色擁有若干許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。
1.資料庫的設計
寫五張表,首先:使用者表、角色表、功能表:
串連表的表..再來就是角色功能表與使用者角色表:
2.管理員的管理頁面,
(1).分別顯示使用者名稱和角色名稱
(2).根據下拉使用者名稱的變化,更改相應複選框中的角色
(3).修改使用者角色時,先要把使用者對應角色表,這個使用者所有的資訊刪除,再把取到的使用者名稱和角色代號新添加。
利用下拉式清單:嵌入php查詢並遍曆出來,以下拉式清單的方式顯示出來
<select id="user">
<?php include ("../db.class.php"); $db = new db(); $sql = "select * from qxyh"; $arr = $db->Query($sql); foreach ($arr as $v) { echo "<option value='{$v[0]}'>{$v[2]}</option>"; } ?>
</select>
選擇角色,用多選框:
<p>請選擇角色<?php$sjs = "select * from qxzw";$ajs = $db->Query($sjs);foreach ($ajs as $v){ echo "<input type='checkbox' value='{$v[0]}' class='ck'/>{$v[1]} ";}?></p><input type="button" value="確定" id="btn"/>
圖:
當使用者發生變化的時候,相應的角色也相應變化,並且改變人員的角色資訊,添加儲存,添加儲存的基本思路是先把資料庫裡人員對應的角色資訊全部刪除,然後再取到選中的部分,添加到資料庫。
先來讓他選中預設角色:
<script> //選中預設角色 function xuan() { var uid = $("#user").val(); $.ajax({ url:"chuli.php", data:{uid:uid,type:0}, type:"POST", dataType:"TEXT", success:function(data) { var juese = data.trim().split("|"); //拆分完全都變成代號 var ck = $(".ck"); ck.prop("checked",false); for(var i=0;i<ck.length;i++) { //便利所有的列表 if(juese.indexOf(ck.eq(i).val())>=0) { ck.eq(i).prop("checked",true); } } } }); }</script>
來寫他的處理頁面:
<?phpinclude ("../db.class.php");$db = new db();$type = $_POST["type"];switch ($type){ case 0: $uid = $_POST["uid"]; $sql = "select jid from qxyhzw WHERE uid='{$uid}'"; echo $db->strQuery($sql);break;}
我們看下最後結果,登入成功就會進入首頁,登入失敗會提示錯誤
再來,儲存按鈕:
<script>//當使用者變化的時候去選中相應角色 $("#user").change(function(){ xuan(); }) //點擊確定儲存角色資訊 $("#btn").click(function(){ var uid = $("#user").val(); //找到使用者名稱 var juese = "";// 找到角色代號 var ck = $(".ck"); //找到所有的checked for(var i=0;i<ck.length;i++) {// 遍曆他 if(ck.eq(i).prop("checked")) {// 如果他選中了,兩個參數是改他的狀態 //娶過來值;加個|分割一下 juese += ck.eq(i).val()+"|"; } } juese = juese.substr(0,juese.length-1);// 去掉最後的| $.ajax({ url:"chuli.php", data:{uid:uid,juese:juese,type:1}, type:"POST", dataType:"TEXT", success:function(data){ alert("修改成功"); } }); }) });</script>
處理頁面:
<?phpinclude ("../db.class.php");$db = new db();$type = $_POST["type"];switch ($type){ case 1: $uid = $_POST["uid"]; $juese = $_POST["juese"]; // 首先全部刪掉裡面的職位 $sdel = "delete from qxyhzw WHERE uid = '{$uid}'"; $db->Query($sdel,0); //拆分取到的字串 $arr= explode("|",$juese); foreach ($arr as $v) { $sql = "insert into qxyhzw VALUES ('','{$uid}','{$v}')"; $db->query($sql,0); } echo "ok"; break;}
看效果:
預設選中角色;
更改以後選擇儲存:
管理頁面總代碼:
View Code
處理頁面總代碼:
<?phpinclude ("../db.class.php");$db = new db();$type = $_POST["type"];switch ($type){ case 0: $uid = $_POST["zhang"]; $sql = "select jid from qxyhzw WHERE uid='{$uid}'"; echo $db->strQuery($sql);break; case 1: $uid = $_POST["zhang"]; $juese = $_POST["juese"]; // 首先全部刪掉裡面的職位 $sdel = "delete from qxyhzw WHERE uid = '{$uid}'"; $db->Query($sdel,0); //拆分取到的字串 $arr= explode("|",$juese); foreach ($arr as $v) { $sql = "insert into qxyhzw VALUES ('','{$uid}','{$v}')"; $db->query($sql,0); } echo "ok"; break;}
3.登入頁面:
顯示很簡單:
<form action="drcl.php" method="post"> <p>帳號:<input type="text" name="zhang"/></p> <p>密碼:<input type="text" name="mi"/></p> <input type="submit" value="登入"/></form>
寫登入處理
<?phpsession_start();include ("../db.class.php");$db = new db();$zhang = $_POST["zhang"];$mi = $_POST["mi"];$sql = "select mi from qxyh WHERE zhang = '{$zhang}'";$mm = $db->strQuery($sql)>0;if($mm = $mi && !empty($mi)){ $_SESSION["zhang"] = $zhang; header("location:chaxun.php");}//else//{// echo "登入失敗";//}
跳轉到首頁面,首頁面代碼:
每個人的首頁面都是不一樣的
<body><h1>首頁面</h1>
<?phpsession_start();include ("../db.class.php");$db = new db();$zhang = "";if(empty($_SESSION["zhang"])){ header("location:qx_dr.php"); exit;}//登入者使用者名稱 $zhang = $_SESSION["zhang"];//根據使用者名稱查角色$sql = "select jid from qxyhzw WHERE uid = '{$zhang}'";$aql = $db->Query($sql);//根據角色代號查功能代號$attr = array();//定義一個存放功能代號的數組foreach ($aql as $v){ $jsid = $v[0];// 角色代號 $ssql = "select rid from qxgnzw WHERE jid='{$jsid}'"; $aaql = $db->strQuery($ssql);//拆分 $adai = explode("|",$aaql); foreach ($adai as $h) { array_push($attr,$h); }}$attr = array_unique($attr);//去重//顯示foreach ($attr as $k){ $ql = "select * from qxgn WHERE code = '{$k}'"; $arr = $db->Query($ql); $arr[0][0]; $arr[0][1]; echo "<p code='{$arr[0][0]}'>{$arr[0][1]}</p>";}?>
</body>
用php的使用者體驗不好,最好還是得用ajax。