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>
通过以上的操作,可以实现在后台直接查看角色目前的权限情况,并且可以勾选或取消勾选来修改相应角色的权限。
1 条评论
高手演示,必有所获