yii2 RBAC使用DbManager實現后臺權限判斷的方法

字號:


    本文實例講述了yii2 RBAC使用DbManager實現后臺權限判斷的方法。分享給大家供大家參考,具體如下:
    首先根據文檔生成yii2 框架中的表
    yii migrate --migrationPath=@yii/rbac/migrations/
    生成如下4表:
    auth_assignment
    auth_item_child
    auth_item
    auth_rule
    使用yii的gii快速生成對應的model,但是由于auth_item表同時存儲角色跟權限,由于后面我們要分角色跟權限來做curd操作,所以我這里新建了一個RoleForm和PermissionForm兩個model來區(qū)分開角色與權限。由于角色跟權限緊緊相連,又在auth_item生成的model中多加一個屬性$child,后面會用到現在先不管。
    下面是角色model的相關代碼
    <?php
    namespace app\models;
    use Yii;
    use app\models\AuthItem;
    use yii\rbac\Item;
    /*
     * 角色model
     * 指尖上的藝術家
     */
    class RoleForm extends AuthItem
    {
      public function init() {
        parent::init();
        $this->type = Item::TYPE_ROLE;//yii-rbac-Role隱藏繼承常量這里的值是1
      }
    }
    下面是權限model的相關代碼
    <?php
    namespace app\models;
    use Yii;
    use app\models\AuthItem;
    use yii\rbac\Item;
    /*
     * 權限model
     * 指尖上的藝術家
     */
    class PermissionForm extends AuthItem
    {
      public function init() {
        parent::init();
        $this->type = Item::TYPE_PERMISSION;//常量值 2
      }
    }
    另外在AuthItem模型中增加一個屬性
    <?php
    class AuthItem.....
    public $child;//用于角色權限添加
    ......
    現在到我們對應的控制器了
    首先我們說權限控制器寫控制器的時候要用到系統自帶的擴展
    。。。
    use yii\rbac\Permission;
    。。。
    /*
     * 權限添加
     */
    public function actionCreate() {
      $model = new PermissionForm();
      if( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
        //rbac中permission對象
        $permission = new Permission();
        $permission->name = trim( $model->name );
        $permission->type = $model->type;
        //權限添加
        Yii::$app->authManager->add( $permission );
      }
    }
    修改的時候 其他的不變就是換了個方法
    /*
     * param string $name 修改的權限名
     * param Object $permission 跟添加一樣提交上來的數據
     */
    Yii::$app->authManager->update( $name, $permission );
    這里是刪除
    //Returns the named permission.
    $permission = Yii::$app->authManager->getPermission( $name );
    //Removes a permission or rule from the RBAC system.
    Yii::$app->authManager->remove( $permission );
    權限的cud都搞定了,查看就不寫了
    下面是角色控制器
    帶上這個
    use yii\rbac\Role;
    /*
     * 角色添加
     */
    public function actionCreate() {
      $model = new RoleForm();
      if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
          //實例化角色對象
          $role = new Role();
          $role->name = $model->name;
          $role->type = $model->type;
          //添加角色
          Yii::$app->authManager->add( $role );
      }
      //權限列表( 添加角色的時候我們就可看到當前有沒有權限來添加 )
      $permissions = $this->loadPermission();
      //將$model跟$permissions....渲染到視圖就好了
    }
    --------------------------------------------------
    /*
     * 修改
     * param string $name 修改的角色名
     * param Object $role 跟添加一樣提交上來的數據
     */
    $bool = Yii::$app->authManager->update( $name, $role );
    刪除的時候就比較麻煩了
    /*
     * param string $name 角色名
     */
    $role = Yii::$app->authManager->getRole( $name );//獲取當前角色對象
    //Returns the child roles.
    $childAll = Yii::$app->authManager->getChildren( $role );
    if ( isset($childAll) ) {//逐一刪除權限
      foreach ($childAll as $value) {
        //Returns the named permission.
        $perObj = Yii::$app->authManager->getPermission($value);
        //Removes a child from its parent.
        Yii::$app->authManager->removeChild( $role, $perObj );
      }
    }
    Yii::$app->authManager->remove( $role );//最后刪除我們的角色了
    最最關鍵的就是我們要給角色賦予權限對吧,如下代碼
    //當前角色所擁有的權限
    $childArray = $this->loadRolePermission( $model->name );//這個就是返回權限數組
    if ( !empty( $childArray ) ) {
      $model->child = $childArray;
    }
    else {
      $model->child = array();
    }
    //Returns all permissions in the system.
    $permissions = Yii::$app->authManager->getPermissions();
    $perArr = array();
    foreach ($permissions as $key => $value) {
      $perArr[$value->name] = $value->name;
    }
    if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
      //角色對象
      $child = isset( $_POST['AuthItem']['child'] ) ? $_POST['AuthItem']['child'] : NULL;
      //表單無法驗證child所以當為空的時候跳回原頁面
      if ( empty( $child ) ) {
        return $this->redirect(..你們要跳的頁面..);
      }
      //判斷角色是否分配權限,已分配則刪除,反之增加新的
      if ( !empty( $childArray ) ) {
        //Removed all children form their parent.
        $bool = Yii::$app->authManager->removeChildren( $model );
        if ( !$bool ) {
          throw new HttpException(404, '別想糊弄我!湊你一臉~~~');
        }
      }
      //當前角色對象
      $role = Yii::$app->authManager->getRole( $model->name );
      //child權限添加
      if( isset( $child ) ) {
        foreach ( $child as $val) {
          //獲取權限
          $childObj = Yii::$app->authManager->getPermission($val);
          //給item_child表寫入數據(權限表)
          Yii::$app->authManager->addChild( $role, $childObj );
        }
        return $this->redirect(..你們要跳的頁面..);
      }
    }
    最后就是我們最后一個控制器了角色與用戶關聯
    /*
     * 創(chuàng)建角色跟用戶之間關聯的關鍵部分代碼
     */
    //Returns the named role.
    $role =Yii::$app->authManager->getRole( $roleName );
    // Assigns a role to a user.
    Yii::$app->authManager->assign( $role, $userId );<pre name="code">/*
     * 權限檢測
     * param int| string $userId 用戶id
     * param string $permission 權限名
     */
    Yii::$app->authManager->checkAccess( $userId , $permission ) )
    下面是判斷權限的
    /*
     * 權限檢測
     * param int| string $userId 用戶id
     * param string $permission 權限名
     */
    Yii::$app->authManager->checkAccess( $userId , $permission ) )
    希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。