http://www.fungj.com/information/rbac-thinkphp323-foundation-to-establish-database-permissions.html
http://www.fungj.com/information/rbac-thinkphp323-according-to-permissions-to-operate-the-display.html
http://www.fungj.com/information/rbac-thinkphp323-vulnerability-to-improve.html
还是一步一步来,前面的角色权限都是通过MySQL直接在后台制作的。
正常的网站还是需要有一个管理员通过相应的连接到相应的页面里,对其他账号或者角色进行权限的分配,最简单的就是需要一个页面能查看角色权限的列表。

制作一个控制器和方法Admin/Role/showlist。
值得注意的是命名空间和调用的命名空间。

namespace Admin\Controller;
use Component\AdminController;

建立一个Role控制器,并且制作showlist显示角色列表和distribute权限分配两个方法。

<?php
//命名空间
namespace Admin\Controller;
use Component\AdminController;

class RoleController extends AdminController {
    //显示角色列表
    public function showlist() {
        $info = M('role')->select();
        $this->assign('info', $info);
        $this->display();
    }

    //权限分配
    public function distribute($role_id) {
        //判断是否提交
        if (!empty($_POST)) {
            $db = new \Model\RoleModel();
            $z = $db->saveAuth($_POST['authname'], $role_id); //传到模型里面一个POST的数据和ROLE_ID识别ID
            if ($z) {
                $this->success('分配权限成功', U('showlist'));
            } else {
                $this->error('分配权限失败', U('showlist'));
            }
        } else {
            //没有提交输出样子
            //根据$role_id查询出权限用户名称
            $info = M('role')->getByrole_id($role_id);
            $rname = $info['role_name'];
            $this->assign('rname', $rname);
            //获取权限信息
            $ainfo = M('auth')->where('auth_level=0')->select(); //父级权限
            $binfo = M('auth')->where('auth_level=1')->select(); //次级权限
            //查询当前对应的角色权限信息
            $authinfo = M('Role')->getByRole_id($role_id);
            $auth_ids = $authinfo['role_auth_ids'];
            $auth_ids_arr = explode(',', $auth_ids); //分隔为数组
            //输出模板
            $this->assign('auth_ids_arr', $auth_ids_arr);
            $this->assign('ainfo', $ainfo);
            $this->assign('binfo', $binfo);
            $this->display();
        }
    }
}
?>

制作控制器后,还需要做一个ROLE模型来收集提交的数据,并更新数据库里的信息。
RoleModel模型

<?php
namespace Model;
use Think\Model;

class RoleModel extends Model {
    //权限分配
    //$auth是方法里面传入进来的一维数组
    public function saveAuth($auth, $role_id) {
        //把传入进来的数组,根据后面的逗号分隔成字符串信息
        $auth_ids = implode(',', $auth);
        //根据IDS,查询具体的操作方法
        $info = M('auth')->select($auth_ids); //返回二维数组信息
        //拼装控制器和方法
        foreach ($info as $k => $v) {
            if ($v['auth_c'] != null and $v['auth_a'] != null) {
                $auth_ac .= $v['auth_c'] . "-" . $v['auth_a'] . ",";
            }
        }
        //删除拼接后右边的逗号
        $auth_ac = trim($auth_ac, ',');
        //制作数组存入数据库
        $data = array(
            'role_id' => $role_id,
            'role_auth_ids' => $auth_ids,
            'role_auth_ac' => $auth_ac,
        );
        return $this->save($data);

    }
}
?>

然后根据两个方法分别制作两个模板。
showlist

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />

    <title>角色列表</title>

    <link href="__PUBLIC__/Admin/css/mine.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <style>.tr_color{background-color: #9F88FF}</style>
    <div class="div_head">
        <span>
            <span style="float: left;">当前位置是:系统管理-》角色权限列表</span>
            <span style="float: right; margin-right: 8px; font-weight: bold;">
                <a style="text-decoration: none;" href="__MODULE__/Goods/add">【添加角色】</a>
            </span>
        </span>
    </div>
    <div></div>
    <div class="div_search">
        <span>
            <form action="#" method="get">
                品牌
                <select name="s_product_mark" style="width: 100px;">
                    <option selected="selected" value="0">请选择</option>
                    <option value="1">苹果apple</option>
                </select>
                <input value="查询" type="submit" />
            </form>
        </span>
    </div>
    <div style="font-size: 13px; margin: 10px 5px;">
        <table class="table_a" border="1" width="100%">
            <tbody>
                <tr style="font-weight: bold;">
                    <td>序号</td>
                    <td>角色名称</td>
                    <td align="center">操作</td>
                </tr>
                {// foreach 循环输出内容}
                <foreach name="info" item="v">
                    <tr id="product1">
                        <td>{$v.role_id}</td>
                        <td>{$v.role_name}</td>
                        <td>
                            <a href="__URL__/distribute/role_id/{$v.role_id}">权限分配</a>
                        </td>
                    </tr>
                </foreach>
            </tbody>
        </table>
    </div>
</body>
</html>

distribute模板,这个模板里是各种套,在判断数组的时候,只能用了TP里的原生php代码,实现判断。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <title>添加权限</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <link href="__PUBLIC__/Admin/css/mine.css" type="text/css" rel="stylesheet"></head>
<body>
    <div class="div_head">
        <span>
            <span style="float:left">当前位置是:权限管理-》添加权限信息</span>
            <span style="float:right;margin-right: 8px;font-weight: bold">
                <a style="text-decoration: none" href="__MODULE__/Goods/showlist">【返回】</a>
            </span>
        </span>
    </div>
    <div></div>
    <div style="font-size: 13px;margin: 10px 5px">
        <form action="__SELF__" method="post" enctype="multipart/form-data">
            <div>
                <span>
                    正在为: <b>{$rname}</b>
                    分配权限
                </span>
                <ul>
                    <foreach name="ainfo" item="v">
                        <li>
                            {$v.auth_name}

                            <input type="checkbox" name="authname[]" value="{$v.auth_id}" <php>if (in_array($v["auth_id"],$auth_ids_arr)) { echo 'checked="checked"' ;}</php> />
                        </li>
                        <ul>
                            <volist name="binfo" id="vv">
                                <eq name="vv.auth_pid" value="$v.auth_id">
                                    <li>
                                        {$vv.auth_name}
                                        <input type="checkbox" name="authname[]" value="{$vv.auth_id}" <php>if (in_array($vv["auth_id"],$auth_ids_arr)) { echo "checked='checked'" ;}</php> />
                                    </li>
                                </eq>
                            </volist>
                        </ul>
                    </foreach>
                </ul>
            </div>
            <input type="submit" value="分配权限" />
        </form>
    </div>
</body>
</html>

通过以上的操作,可以实现在后台直接查看角色目前的权限情况,并且可以勾选或取消勾选来修改相应角色的权限。

最后修改:2016 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏