thinkphp下的RABC 實現——2015/5/7

 

目前有一個問題:

雖然給用戶及角色分配了權限,也實現對應的權限的顯示

但是用戶可以通過顯示修改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"));
            }
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章