php人員權限管理(RBAC)


在說權限管理前,應該先知道權限管理要有哪些功能:

  (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>

選擇角色,用多選框:

<div>
請選擇角色
<?php
$sjs = "select * from qxzw";
$ajs = $db->Query($sjs);
foreach ($ajs as $v)
{
    echo "<input type='checkbox' value='{$v[0]}' class='ck'/>{$v[1]} ";
}
?>
</div>
<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>

來寫他的處理頁面:

<?php
include ("../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>

處理頁面:

<?php
include ("../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;
}

看效果:

默認選中角色;

更改以后選擇保存:

管理頁面總代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>無標題文檔</title>
    <script src="../jquery-1.11.2.min.js"></script>
</head>
<body>
<h1>用戶與角色管理</h1>
<!--顯示所有用戶-->
<div>請選擇用戶
<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>
</div>
<div>
請選擇角色
<?php
$sjs = "select * from qxzw";
$ajs = $db->Query($sjs);
foreach ($ajs as $v)
{
    echo "<input type='checkbox' value='{$v[0]}' class='ck'/>{$v[1]} ";
}
?>
</div>
<input type="button" value="確定" id="btn"/>

</body>
</html>
<script type="text/javascript">
    $(document).ready(function(e){
        xuan();
        //當用戶變化的時候去選中相應角色
        $("#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("修改成功");
                }
            });

        })
    });

    //選中默認角色
    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>

處理頁面總代碼:

<?php
include ("../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">
    <div>帳號:<input type="text" name="zhang"/></div>
    <div>密碼:<input type="text" name="mi"/></div>
    <input type="submit" value="登入"/>
</form>

寫登入處理

<?php
session_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><?php
session_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 "<div code='{$arr[0][0]}'>{$arr[0][1]}</div>";
}

?></body>

 

 

用php的用戶體驗不好,最好還是得用ajax


免責聲明!

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



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