可以用框架的RBAC,本篇不是该方法。本篇主要介绍通过动态修改配置,在layout布局模板中,根据不同管理人员,动态加载相应的权限列表。
大体流程:后台登录【根据管理人员权限等级】-》查询权限列表【返回管理权限列表】-》动态写入到配置权限php文件-》跳转时根据权限配置表将数据发送至layout-》显示
登录时关键代码:
switch ($rtn["权限字段"])
{
case 0:$tmp='(1,2,3,4)';break;
case 1:$tmp='(1,2,4)';break;
case '2':$tmp='()';break;
default:
$this->error('请确保您有后台管理权限:(');break;
}
$authhead=$model->where('auth_level=0 and auth_path in '.$tmp)->getField('auth_id,auth_name,auth_path,auth_level');
$listbody=$model->where('auth_level=1')->getField('auth_id,auth_name,auth_func,auth_path,auth_level');
writeAuth($authhead,$listbody); 权限文件位于当前分组-》conf目录下:文件:1、auth.php-权限文件;2、config.php
1、动态写入、读取权限文件
2、config.php return array('LOAD_EXT_CONFIG'=>'auth');
writeAuth写在common 文件 function.php中,代码如下:
function writeAuth($arr1,$arr2) {
$path =MODULE_NAME. '/Conf/auth.php';
if(!@fileperms($path)==33206){ //读取指定文件权限
@chmod($path, 0777); //如果权限不够,修改权限文件权限;
}
$rtn= file_put_contents($path, "<?php return array(\r\n 'head'=>" . var_export($arr1,true) . ",\r\n'body'=>".var_export($arr2,true)."\r\n);", LOCK_EX);
@unlink(RUNTIME_FILE);
return $rtn;
}正常情况下是无法写入配置文件,通过 @chmod($path, 0777);修改亲测可用!
登录权限配置修改后,后台控制器,自定义一个父类控制A,所有后台都继承于A,当然可以在每个控制添加下面代码。不如直接在父控制器写一个~
function __constructor(){
$this->assign('head',C('authhead'));
$this->assign('body',C('listbody'));
if (!isset($_SESSION['*****'])) {
$this->error('对不起,您还没有登录!请先登录再进行浏览', U('***'), 1);
}}普通控制 初始化时 parent::__constructor();在布局模板中将读取的配置权限信息动态显示。
<foreach name="head" item="vo">
<div class="panel panel-primary">
<div class="panel-heading toggle" >
<h4 class="panel-title">{$vo.auth_name}</h4>
</div>
<div class="panel-body">
<div class="list-group">
<foreach name="body" item="vo1">
<if condition="$vo1['auth_path'] eq $vo['auth_path']">
<a href="{:U($vo1['auth_func'])}" class="list-group-item">
{$vo1.auth_name}</a>
</if>
</foreach>
</div>
</div>
</div>
</foreach>数据库权限表:
ok,如有不清楚的地方可以留言~~
最佳答案