目前有一個問題:
雖然給用戶及角色分配了權限,也實現對應的權限的顯示
但是用戶可以通過顯示修改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")); } } } }