出现场景:
\1. 没有登录,也能访问网页
\2. 没有相关权限,也能访问对应的控制器和方法
解决方案:
定义一个CommonController,其他控制器继承CommonController,在CommonController中定义初始化方法_initialize
注:这里用的是tp3.2框架,如果我们直接在CommonController中定义__constrct构造方法,会造成重写Controller,所以我们直接使用_initialize方法(_initialize方法是tp框架的初始化方法)
注:也可以parent::__construct();[tp框架中推荐用_initalize方法,如果是其他框架或是原生,可以用parent::__construct()]
具体实施:
1. 解决没有登录也可以访问网页
<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller {
Public function _initialize(){
// 初始化的时候检查用户权限
if(!isset($_SESSION['username']) || $_SESSION['username']==''){
$this->redirect('Login/login');
}
}
}
?>
核心思想: 判断是否有session
2. 解决没有相关权限,也能访问对应的控制器和方法
核心思想:
(1) 从session中获取当前访问的角色id role_id
(2) 根据role_id从role表中查询role_auth_path的值(role_auth_path记录了当前角色所有能够访问的控制器-方法字符串)
(3) 获取当前访问的控制器-方法字符串,和当前角色的role_auth_path进行比较,如果当前访问的控制器-方法在role_auth_path中,则让其正常访问, 如果不在,则说明当前角色不具有访问权限,为跳墙访问
数据表地址: http://blog.csdn.net/m_nanle_xiaobudiu/article/details/79443389
具体实施:
<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller{
function _initialize(){
//检测session
if(!session('?id')){
$this->error('您尚未登录,请登录后再访问', U('Index/login'));
}
//获取当前访问的控制器-方法
$now_path = CONTROLLER_NAME.'-'.ACTION_NAME;
//获取session中的roleid,从role表中获取role_auth_path
$role_id = session('role_id');
$role_info = D('Role')->field("role_auth_path")->find($role_id);
$role_auth_path = $role_info['role_auth_path'];
//将 role_auth_path 转为数组
$role_auth_path = explode(',', $role_auth_path);
//判断$now_path是否在$role_auth_path中
if(!in_array($now_path, $role_auth_path)){
//如果不存在,则为跳墙访问,跳转回登录页
$this->error('您无权访问该模块,请重新登录再访问', U('Index/login'), 3);
}
}
}
备注:
为角色分配权限
html部分:
角色列表页面roleList.html
<table >
<thead>
<tr>
<th>
<input name="" type="checkbox" value="" id="checkAll" />
</th>
<th>编号</th>
<th>角色名</th>
<th>权限ids</th>
<th>权限路径</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<foreach name="role_list" item="vo">
<tr>
<td>
<input name="" type="checkbox" value="" />
</td>
<td>{$vo.role_id}</td>
<td>{$vo.role_name}</td>
<td>{$vo.role_auth_ids}</td>
<td>{$vo.role_auth_path}</td>
<td>
<a href="{:U('distribute', 'role_id='.$vo[role_id])}" class="tablelink">分配权限</a>
<a href="#" class="tablelink"> 删除</a>
</td>
</tr>
</foreach>
</tbody>
</table>
权限列表 distribute.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script language="JavaScript" src="__ADMIN__/js/jquery.js"></script>
</head>
<body>
<div>
<form action="" method="post">
<input type="hidden" name="role_id" value="{$Think.get.role_id}" />
您正在给【<label style="color: red;font-weight: bolder;">{$role_info.role_name}</label>】设置权限
<ul>
<table>
<thead>
<tr>
<th>权限分类</th>
<th>权限</th>
</tr>
</thead>
<tbody>
<foreach name="auth_p" item="vo">
<tr>
<td>
<in name="vo.auth_id" value="$role_info.role_auth_ids">
<input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" checked="checked" />
<else />
<input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" />
</in>
{$vo.auth_name}
</td>
<td>
<foreach name="auth_s" item="v">
<if condition="$v.auth_pid eq $vo.auth_id ">
<input type="checkbox" name="auth_id[]" value="{$v.auth_id}"
<in name="v.auth_id" value="$role_info.role_auth_ids">checked="checked"</in>
>{$v.auth_name} 
</if>
</foreach>
</td>
</tr>
</foreach>
</tbody>
</table>
<br/>
<li>
<label> </label>
<input name="" id="btnSubmit" type="button" class="btn" value="确认保存" />
</li>
</ul>
</form>
</div>
</body>
<script type="text/javascript">
$(function(){
//给btnsubmit绑定点击事件
$('#btnSubmit').on('click',function(){
//表单提交
$('form').submit();
})
});
</script>
</html>
php部分: 对应的方法:
<?php
function distribute(){
$role_model = D('Role');
if(IS_POST){
//1. 接收role_id的值
$role_id = I('post.role_id');
//1. 接收表单数据
$ids = I('post.auth_id');
//dump($ids);
//2. 将数组转为字符串
$ids = implode(',', $ids);
//3. 根据ids从auth表中查询数据,拼接role_auth_path需要数据
$auth_list = D('Auth')->where("auth_id in ($ids)")->select();
//dump($auth_list);die;
$role_auth_path = '';
foreach($auth_list as $value){
if($value['auth_c'] != ''){
$role_auth_path .= $value['auth_c'].'-'.$value['auth_a'].',';
}
}
//去掉最后一个 ,
$role_auth_path = rtrim($role_auth_path, ',');
//4. 构造修改数据
$save_data = array(
'role_id' => $role_id,
'role_auth_ids' => $ids,
'role_auth_path' => $role_auth_path
);
if($role_model->save($save_data)){
$this->success('分配权限成功', U('roleList'), 3);
} else {
$this->error('分配权限失败', U('roleList'), 3);
}
} else {
//1.接收角色id
$role_id = I('get.role_id');
//2. 根据角色id查询角色信息
$role_info = $role_model->find($role_id);
//3. 分配到模板
$this->assign('role_info', $role_info);
//4. 分一二级读取auth表中的权限信息
$auth_model = D('Auth');
$auth_p = $auth_model->where('auth_pid=0')->select();
$auth_s = $auth_model->where('auth_pid!=0')->select();
$this->assign('auth_p', $auth_p);
$this->assign('auth_s', $auth_s);
$this->display();
}
}
?>