thinkphp rabc權限總結

今天晚上把ThinkPHP的權限分配弄明白了,內心的包袱馬上放下了,感受那個爽啊!稍微記錄一下。php

背景:CMS系統開發(17do)。html

項目分組:Admin(後臺管理)、Home(前臺顯示)。
Admin組中包含ManagerAction、UserActin、ArticleAction三個控制器node

第一部分:表關係對應(箭頭是指數據來源)數據庫

 ThinkPHP擴展RBAC權限分配

ThinkPHP擴展RBAC權限分配
其中表結構式根據RBAC規定的結構建立的。緩存

定義結果:站長1能訪問項目用戶和文章的全部操做,管理員3只能對文章模塊操做不能訪問用戶模塊。session

 

第二部分:項目配置
項目的config.php文件中添加函數

    //權限分配設置
     'USER_AUTH_ON'=>true, //是否須要認證
    'USER_AUTH_TYPE'=>1, //認證類型
    'USER_AUTH_KEY'=>'userId',  // 認證識別號
    'USER_AUTH_MODEL'=>'user',//模型實例(用戶表名)
    'REQUIRE_AUTH_MODULE'=>'User',  //須要認證模塊
    'NOT_AUTH_MODULE'=>'',   //無需認證模塊
    'USER_AUTH_GATEWAY'=>'/Public/login', //認證網關
    //RBAC_DB_DSN  數據庫鏈接DSN
    'RBAC_ROLE_TABLE'=>'do_role', //角色表名稱
    'RBAC_USER_TABLE'=>'do_role_user', //用戶和角色對應關係表名稱
    'RBAC_ACCESS_TABLE'=>'do_access', //權限分配表名稱
    'RBAC_NODE_TABLE'=>'do_node',  // 權限表名稱post

 

 

 

第三部分:權限信息寫入控制器this

    public function checkUser(){
        //表單數據不能爲空
        if($this->_post('username')&&$this->_post('password')&&$this->_post('verifycode')){
            $pwd=  $this->_post('password');
            $username=  $this->_post('username');
            //驗證碼是否正確
            $verify=  $this->_post('verifycode');
            if($this->_session('verify')!=  md5($verify)){
                $this->error("驗證碼錯誤");
            }else{
                //建立數據庫對象
                $user=M('user');
                //根據用戶名查詢               
                $cond['username']=$username;
                $cond['active']=array('gt',0);
                //加載RBAC類
                import('ORG.Util.RBAC');
                //經過authenticate讀取用戶信息
                $result=RBAC::authenticate($cond);
                //dump($result);
                if($result){
                    if($result['password']==md5($pwd)){
                        $_SESSION[C('USER_AUTH_KEY')]=$result['id'];
                        $_SESSION["name"]=$result['name'];
                        //使用saveAccessList緩存訪問權限
                        RBAC::saveAccessList();
                        $this->display('Manager:index');
                    }else{
                        $this->error("用戶密碼錯誤");
                    }
                }else{
                    $this->error("用戶名不存在或已經被禁用");
                }url

 }

第四部分:建立驗證權限控制器

 class CommonAction extends Action{

    //_initialize()方法是ThinkPHP提供的入口方法,相似於原PHP中__condition()構造函數。能夠存放全部公用信息。
    function _initialize(){
        //判斷是否開啓認證,而且當前模塊須要驗證
        if(C('USER_AUTH_ON')&&!in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))){
            //導入RBAC類,開始驗證
            import('ORG.Util.RBAC');
            //經過accessDecision獲取權限信息
            if(!RBAC::AccessDecision()){
                //沒有獲取到權限信息時須要執行的代碼
                //一、用戶沒有登陸
                if(!$_SESSION[C('USER_AUTH_KEY')]){
                    $url= U('Public/login');
                    $this->error("您尚未登陸不能訪問",$url);
                }
                $this->error("您沒有操做權限");
            }
        }
    }
}

 

第五部分:驗證控制器調用

只要須要權限驗證的控制器繼承CommonAction就能夠啦!ThinkPHP擴展RBAC權限分配

使用admin帳號登錄能正常訪問

ThinkPHP擴展RBAC權限分配
使用xiaoxiao帳號登錄後不能訪問用戶列表頁面
ThinkPHP擴展RBAC權限分配

相關文章
相關標籤/搜索