2017-08-06 3 views
1

Je travaille actuellement avec rbac yii2. J'ai défini tous les rôles et toutes les permissions dans la base de données. Maintenant la question pour moi est où devrais-je vérifier la règle d'accès? Par exemple auteur peut mettre à jour ses propres messages. J'ai également enregistré la règle dans la base de données sous le nom rule_name = 'isAuthor'. Mais je suis confus au sujet de la condition de vérification pour accéder aux propres messages.Comment implémenter la méthode can()?

Voici mon actionRule:

<?php 
public function actionRule(){ 
    $auth = Yii::$app->authManager; 
    $rule = new \app\rbac\AuthorRule; 
    $auth->add($rule); 

    $updateMobile = $auth->createPermission('mobile/update'); 

    // add the "updateOwnMobile" permission and associate the rule with it. 
    $updateOwnMobile = $auth->createPermission('updateOwnMobile'); 
    $author = $auth->createPermission('author'); 
    $updateOwnMobile->description = 'Update own mobile'; 
    $updateOwnMobile->ruleName = $rule->name; 
    $auth->add($updateOwnMobile); 

    // "updateOwnMobile" will be used from "updatePost" 
    $auth->addChild($updateOwnMobile, $updateMobile); 

    // allow "author" to update their own posts 
    $auth->addChild($author, $updateOwnMobile); 
} 
?> 

Où et comment puis-je mettre en œuvre cela? dans le contrôleur? comportement? ou d'autres lieux?

Répondre

0

Dans le cas du upated pour auteur propre poste le chèque (can('author') méthode) doit être placé dans le contrôleur pour deux raisons au moins:

  1. Vous devriez vérifier non seulement si l'utilisation a un rôle/auteur d'autorisation Une fois que vous avez vérifié si l'utilisateur peut ou non exécuter le code correspondant, vous devez générer la bonne réponse (afficher le formulaire de mise à jour si l'utilisateur peut le faire ou un message refusé si ce n'est pas le cas)

Ce sont des t contrôleur ipically/opérations d'action ..

Ce ne sont que quelques premières suggestions

0

Idéalement, vous devriez avoir une classe (allant de Yii\rbac\Rule) associée à la règle. Ensuite, implémentez la fonction execute qui vérifie si l'utilisateur est l'auteur de la publication et qu'il a accès à la mise à jour de la publication.

Quelque chose comme ceci:

class SiteRule extends Rule 
{ 

    //you can modify this to suit your needs. 
    public function execute($user, $item, $params) 
    { 
     //get user ie: \dektrium\user\models\User::findIdentity($user) 
     //check if the $user is the author - using defined author or created-by  attribute in $params. 
     //return true/false 
    } 
} 

puis dans votre contrôleur/action, vous pouvez utiliser la méthode CheckAccess() (yii\rbac\ManagerInterface) pour vérifier si l'utilisateur a accès:

if(\yii::$app->user->can('author', ['post'=>\Yii::$app->request->post()(or your model])) 
{//logic here}