2012-06-09 3 views
3

Я слежу за этим учебным пособием, который является отличным и имеет один вопрос.Реализация авторизации на основе ролей в Yii Framework

http://www.larryullman.com/2010/01/07/custom-authentication-using-the-yii-framework/

я могу получить доступ к свойству роли, как это, в любом месте в моем коде приложения:

Yii::app()->user->role 

, но то, что я действительно хотел бы сделать, это использовать авторизацию контроллера по умолчанию в моем UserController :

/** 
    * Specifies the access control rules. 
    * This method is used by the 'accessControl' filter. 
    * @return array access control rules 
    */ 
public function accessRules() 
{ 
    return array(
    array('allow', // allow all users to perform 'index' and 'view' actions 
    'actions'=>array('*'), 
    'users'=>array('@'), 
    // Fails 
    'roles'=>array(ModelConstantsRole::ADMIN), 
    // Also Fails 
    'expression'=>'(isset(Yii::app()->user->role) && (Yii::app()->user->role==ModelConstantsRole::ADMIN))', 
    ), 
    array('deny', // deny all users 
    'users'=>array('*'), 
    ), 
); 
} 

оказывается, что класс, который на самом деле проверяет правила, определенные в accessRules самом деле не знает ничего о своем г оле, что я назначил его. CAccessControlFilter (для тех из вас, кто не хочет его искать в течение 40 минут XD).

Любые идеи о том, как я могу использовать метод accessRules, когда я совмещаю его с подходом Ларри?

Спасибо!

ответ

5

Из вашего кода он выглядит, как вы хотите применить это правило ко всем действиям, чтобы сделать это, Вы должны покинуть массив действия неопределенным или пустой массив:

//empty actions 
array('allow', 
'actions'=>array(),//array('*'), 
... 
) 

Или неопределенные:

array('allow', // allow all users to perform 'index' and 'view' actions 
//'actions'=>array('*'), 
... 
) 

Это уже documented in the docs:

массив ( 'позволяет', // или 'отрицать'
// опциональный, список идентификаторов действий (чувствительно к регистру), что это правило относится
// если не указано, правило применяется все действия
'действия' => Array ('редактировать', 'удалить'),

Имейте в виду, что массив ролей снова массив с именами ролей, например:

'roles'=>array('role1','role2','role3') 

Тогда вам не нужно «выражение», поскольку все, что вы делаете, уже выполняется с помощью массива ролей.

Редактировать: После прочтения учебника, которое вы связали, кажется, что он не реализовал RBAC. Опция 'roles' использует rbac, поэтому без нее она не будет работать. Следовательно, вам придется использовать опцию 'expression' вместо этого, и ваш вариант 'expression' выглядит отлично.

+0

Если вам нужны разъяснения или если мой ответ неполный для вас, пожалуйста, прокомментируйте –

+0

прочитайте мое редактирование, если вы не используете rbac, тогда вы можете использовать выражение 'вместо" role ", и выражение, которое вы определили, выглядит отлично.но вам все равно нужно удалить/изменить свою опцию 'action', как уже упоминалось в моем ответе. –

+0

Это выглядит как отличный ответ, особенно со ссылкой на документы о том, как нет такой вещи, как «actions» => array ('*'). Я проверю это завтра утром, когда вернусь к своему компьютеру, и если все будет работать, я приму свой ответ! –

0

Попробуйте установленные действия правильно

array('allow', // allow all users to perform 'index' and 'view' actions 
    'actions'=>array('view', 'delete', 'update'), 
+0

Это не повторяет мою ситуацию. Вы разрешили доступ к трем действиям здесь, а не ко всем действиям. –

+1

Если вам нужно все действие, не устанавливайте «действия» – Sergey