目前有一个问题:
虽然给用户及角色分配了权限,也实现对应的权限的显示
但是用户可以通过显示修改url地址达到访问其他权限的目的
解决:
每次用户访问的控制器和方法都需要和对应的角色里边的ac信息进行比较
ac信息里边存在这个控制器和方法就允许访问,否则禁止访问
技术角度:
在每个控制器被实例化执行的同时就判断当前的控制器和方法是否允许角色访问
为了程序维护方便,给普通控制器制作父类控制器,在父类控制器的构造方法里边做控制器和方法的过滤工作。
1. 在新父类控制器AdminController里边实现每次访问控制器和操作方法过滤
a) 具体限制分三种情况
i. 自定义方法不进行权限限制(Index/head left right Manager/login)
ii. 系统管理员也不进行权限限制
iii. 当前用户允许访问的权限就是角色对应的权限
namespace Component; use Think\Controller; class AdminController extends Controller { public function __construct() { parent::__construct(); $role = D('role'); $allowed_auth = array("Index-left","Index-index","Index-right","Index-head","Manager-login","Manager-logout"); $condition1 = $_SESSION['mg_role_id']; $role_info = $role->where("role_id=$condition1")->find(); $admin_auth = $role_info['role_auth_ac']; $module_action = CONTROLLER_NAME . "-" . ACTION_NAME; //echo $module_action; if($_SESSION['mg_role_id']==null){ $this->error('请先登录',U("Manager/login")); }else { if (!in_array($module_action, $allowed_auth) && $_SESSION['mg_role_id'] != 0 && strpos($admin_auth, $module_action) === false) { $this->error('没有访问权限', U("Index/index")); } } } }