RBAC не работает в yii

У меня есть таблица сотрудников, которая содержит emp_id, адрес электронной почты, пароль и роли. Я указал пользователя и администратора в качестве значения для ролей поля. Я также создал компонент веб-пользователя, который расширяет CWebUser. Это мой код веб-пользователя.

class WebUser extends CWebUser
{
public function checkAccess($operation, $params=array())
{
    if (empty($this->id)) {
        // Not identified => no rights
        return false;
    }
    $role = $this->getState("roles");
    if ($role === 'admin') {
        return true; // admin role has access to everything
    }
    return ($operation === $role);
}

}

Это мой код UserIdentity.

class UserIdentity extends CUserIdentity
{
private $_id;

public function authenticate()
{
        $user= Employee::model()->find('LOWER(email)=?',array(strtolower($this->username)));
        if($user===null)
        $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if(!$user->validatePassword($this->password))
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
        $this->_id=$user->emp_id;
                    $this->setState('roles',$user->roles);
        $this->username=$user->email;
        $this->errorCode=self::ERROR_NONE;
            }
    return $this->errorCode==self::ERROR_NONE;
}

}

Это мой код контроллера.

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','update','delete'),
            'roles'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    );
}

Кажется, все в порядке. Но когда я пытаюсь обновить, это не работает, и я пробовал это для человека, у которого есть значение администратора для ролей. Пожалуйста, поправьте меня, если я ошибаюсь.


person Sridhar    schedule 19.05.2014    source источник
comment
Я думаю, что существует неправильная оценка типа между ролями, которые вы устанавливаете в методе аутентификации (это создает впечатление, что вы устанавливаете массив ролевых моделей, связанных с вашим объектом Employee, который представляет аутентифицированного пользователя), если это случае $role = $this->getState(roles); предоставит вам массив ролей, которые вы должны перебирать, вместо прямого сравнения.   -  person Snivs    schedule 19.05.2014


Ответы (1)


Я думаю, что проблема в checkAccess - вам нужно получить доступ к модели Employee

class WebUser extends CWebUser
{
  private $_model = null;
  public function getModel(){
      if (!$this->isGuest && $this->_model === null) {
          $this->_model = Employee::model()->findByPk($this->id);
      }
    return $this->_model;
  }

  public function checkAccess($operation, $params=array()){
    return  $this->model->roles == 'admin';
  }
}

Если ваше приложение не будет сложным, это должно сработать. Но лучше использовать PhpAuthManager (или DbVersion) с полной поддержкой RBAC.

person yujin1st    schedule 11.06.2014