5行程式碼搞定基於Auth的許可權認證

發表於2019-05-11

在這兩天的工作中,用到了基於Auth的許可權認證。我在系統中要根據不同的使用者,判斷使用者的各種屬性值來給該使用者賦予不同的許可權。比如:
1、使用者是否是管理員?是否具有管理員操作許可權?
2、使用者積分是否達到某個值,達到了不同值具有不同的許可權?
3、使用者所在部門是否符合規則,具有某些許可權?
4、使用者等級是否符合規定值,具有某些特殊許可權?
。。。。。。
等等,還有很多很多規則

其實,用Auth來判斷使用者許可權,其原理就是,根據事先訂立好的規則來判斷該使用者指定的屬性是否符合規則要求。

通常情況下,只是一個簡單的判斷,就是通過$auth->check();返回值,來判斷該使用者是否符合規則。有些時候這樣的判斷我們在控制器裡做,判斷後執行不同的程式碼,或者是在模板中呼叫,判斷後顯示不同的模板內容,比如不同的使用者顯示不同選單等,這樣在模板呼叫的時候,就會帶來很多麻煩。

為了能在整個專案中方便呼叫,我這裡把他寫在Common/common.php中,寫了一個函式
/*
$rule,要驗證的規則名稱;
$uid,使用者的id;
$relation,規則組合方式,預設為‘or’,以上三個引數都是根據Auth的check()函式來的,
$t,符合規則後,執行的程式碼
$f,不符合規則的,執行程式碼,預設為丟擲字串‘沒有許可權’
*/
 function authcheck($rule,$uid,$relation='or',$t,$f='沒有許可權'){
    import('ORG.Util.Auth');
    $auth=new Auth();
    return $auth->check($rule,$uid,$relation)?$t:$f;
 }


呼叫例子:

在模板中呼叫(例如,判斷使用者是否具有管理員許可權,有顯示管理選單,沒有則不顯示)
<a href="{:U(GROUP_NAME.'/Login/logout')}" target="_self">退出</a>
<a href="{:U(GROUP_NAME.'/User/changepass')}" target="_self">修改密碼</a>
<!--//這裡要判斷使用者許可權//-->
{:authcheck('adminmenu',$uid,'or','<a href="/Home/Admin/index">管理中心</a>','')}

在控制器中呼叫:

例如:使用者符合規則後,執行函式haha(),不符合的,執行函式nohaha()
class IndexAction extends CommonAction{
    public function index(){
    authcheck('topmenu',session('uid'),'or',$this->haha(),$this->nohaha());
    }
    
    public function haha(){
        return '符合規則';    
    }
    public function nohaha(){
       return  '不符合規則';
   }
 }


在控制器中呼叫的時候,靈活性更大一點,傳入的$t 和 $f 兩個引數可以是字串、函式、陣列、甚至是true和false都可以。根據自己專案不同的使用場景可以自己進行處理...

簡單5行程式碼,一個函式,搞定整個專案的Auth使用者許可權認證.~~hah ~~
好了,文章寫完,陪老婆兒子吃牛排去·~~哈哈~~

--------------------函式改良版 08.13-----------------------------
為了能讓超級管理員跳過驗證直接具有許可權,對函式進行了改良。首先在配置檔案中config.php中定義一個配置引數"adminnistrator“,陣列型別。
'administrator'=>array('1','3'),    //定義UID為1和3的使用者為超級管理員;

程式碼如下:
function authcheck($rule,$uid,$relation='or',$t,$f='沒有許可權'){
        //判斷當前使用者UID是否在定義的超級管理員引數裡
    if(in_array($uid,C('administrator'))){    
        return $t;    //如果是,則直接返回真值,不需要進行許可權驗證
    }else{
                //如果不是,則進行許可權驗證;
        import('ORG.Util.Auth');
        $auth=new Auth();
        return $auth->check($rule,$uid,$relation)?$t:$f;
    }
 }
評論(0)

相關文章