0

Ich habe einen Controller mit der folgenden Zugriffsbeschränkung:Yii2. Zugriffskontrolle nach Rollen Wie kann ich eine ODER-Bedingung hinzufügen?

'access' => [ 
       'class' => AccessControl::className(), 
       'only' => ['index', 'view', 'create', 'update', 'delete'], 
       'rules' => [ 
        [ 
         'actions' => ['index', 'view'], 
         'allow' => true, 
         'roles' => [RbacComponent::VIEW_EXPENSES_ACCOUNTS_KEY], 
        ], 
        [ 
         'actions' => ['create'], 
         'allow' => true, 
         'roles' => [RbacComponent::CREATE_EXPENSES_ACCOUNTS_KEY], 
        ], 
        [ 
         'actions' => ['update'], 
         'allow' => true, 
         'roles' => [RbacComponent::EDIT_EXPENSES_ACCOUNTS_KEY], 
        ], 
        [ 
         'actions' => ['delete'], 
         'allow' => true, 
         'roles' => [RbacComponent::DELETE_EXPENSES_ACCOUNTS_KEY], 
        ], 
       ], 
      ], 

Wie kann ich 'OR' \ Yii :: $ app-> user-> identitäts> isOwner() in den alle, dass die Regeln?

Ich habe versucht, diese Variante zu verwenden:

  [ 
       'actions' => ['index', 'view'], 
       'allow' => true, 
       'roles' => [RbacComponent::VIEW_EXPENSES_ACCOUNTS_KEY], 
       'matchCallback' => function ($rule, $action) { 
        return \Yii::$app->user->identity->isOwner(); 
       } 
      ], 

Aber in diesem Fall wird es UND 'sein und wird nicht funktionieren.

Ich denke, diese Variante funktioniert:

  'rules' => [ 
       [ 
        'actions' => ['index', 'view', 'create', 'update', 'delete'], 
        'allow' => true, 
        'roles' => ['@'], 
        'matchCallback' => function ($rule, $action) { 
         if ($action == 'index') { 
          if (\Yii::$app->user->identity->isOwner() || \Yii::$app->user->can(RbacComponent::VIEW_EXPENSES_ACCOUNTS_KEY)) { 
           return true; 
          } 
         } 

         ... other actions 

        } 
       ], 

Aber vielleicht ist es besser und einfacher Weg?

Antwort

1

arbeiten Sie einfach eine Regel mit Ihrem Rückruf hinzu:

'rules' => [ 
    [ 
     'actions' => ['index', 'view'], 
     'allow' => true, 
     'roles' => [RbacComponent::VIEW_EXPENSES_ACCOUNTS_KEY], 
    ], 
    [ 
     'actions' => ['create'], 
     'allow' => true, 
     'roles' => [RbacComponent::CREATE_EXPENSES_ACCOUNTS_KEY], 
    ], 
    [ 
     'actions' => ['update'], 
     'allow' => true, 
     'roles' => [RbacComponent::EDIT_EXPENSES_ACCOUNTS_KEY], 
    ], 
    [ 
     'actions' => ['delete'], 
     'allow' => true, 
     'roles' => [RbacComponent::DELETE_EXPENSES_ACCOUNTS_KEY], 
    ], 
    [ 
     'actions' => ['index', 'view', 'create', 'update', 'delete'], 
     'allow' => true, 
     'matchCallback' => function ($rule, $action) { 
      return \Yii::$app->user->identity->isOwner(); 
     }, 
    ], 
], 
+0

Danke für Ihre Antwort. Ich werde versuchen, das zu tun. –

0

könnten Dies sollte

[ 
    'allow' => true, 
    'roles' => ['owner'], 
], 
+0

Vielen Dank für Ihre Antwort, aber 'owner' keine Rolle ist. Es ist eine Methode. –

+0

Aber Sie können "Besitzer" als Rolle und eine Regel für diese Rolle hinzufügen. – vityapro

Verwandte Themen