Extended CWebUser et réécriture Yii AccessControl
Question
J'ai récemment étendu CWebUser classe et maintenant son a de telles méthodes utiles:
Yii::app()->user->isAdmin;
Yii::app()->user->isTeacher;
Yii::app()->user->isStudent;
Maintenant, il y a des problèmes avec AccessControl filtre.
Avant, pour permettre l'accès uniquement admin, je:
public function accessRules()
{
return array(
array('allow',
'actions'=>array('index','update', 'create', 'delete'),
'users'=>array('admin'),
),
array('deny',
'users'=>array('*'),
),
);
}
Comment réécrire accessRules à déléguer l'accès uniquement pour les utilisateurs, qui ont une application Yii :: () -> user-> isAdmin attribut
La solution
Vous pouvez ajouter une option 'expression' à la configuration. Normalement, il obtient un « utilisateur $ » comme argument. Ainsi, vous pouvez faire quelque chose comme:
array('allow',
'actions'=>array('index','update', 'create', 'delete'),
'expression'=> '$user->isAdmin',
),
Notez que je n'ai pas testé cela, mais je pense que cela va fonctionner.
Autres conseils
Eh bien, il ne fonctionnera pas parce qu'il sait Yii :: app () -> utilisateur comme instance CWebUser et vous développé la classe UserIdentity il dirait « CWebUser et ses comportements n'ont pas une méthode ou la fermeture nommée « isAdmin « '! Pour utiliser des expressions comme $ user-> isAdmin votre devrait définir la propriété de isAdmin lancer la commande setState qui utiliserait session pour sauver qu'habituellement dans la méthode d'authentification de sorte qu'il serait quelque chose comme ceci:
class UserIdentity extends CUserIdentity
{
public function authenticate()
{
//your authentication code
//using your functions like $level=$this->isTeacher();
//or $level=$this->isAdmin();
$this->setState('isAdmin',$level);
}
}
et maintenant dans le contrôleur de l'utilisateur dans la méthode accessRules vous pouvez avoir des expressions
public function accessRules()
{
return array(
array('allow',
'actions'=>array('action1','action2',...),
'expression'=>'$user->isAdmin',
//or Yii::app()->user->getState('isAdmin'),
),
//...
);
}