2016-04-01 17 views
5

Questa è una domanda sull'utilizzo di RBAC in Yii2.Yii2 RBAC Rule Feedback/Message

Finora ho trovato che funziona piuttosto bene e soddisfacente, tuttavia c'è una caratteristica fondamentale che mi manca: la possibilità per le regole Yii2 di fornire "feedback" in modo simile a come i validatori Yii2 impostano i messaggi di errore per spiegare perché la validazione è fallita. Sto cercando un modo per fornire una sorta di feedback sul perché il permesso non è stato concesso.

In particolare, il metodo can() restituirà un valore booleano tipo , che va bene, ma quando si controlla il permesso non abbiamo idea di perché esattamente l'utente non è stato concesso che un particolare permesso.

Per dare un esempio più pratico. Diciamo che stiamo cercando di determinare se l'utente corrente può inviare un commento. Vorremmo solito fare qualcosa di simile:

if (Yii::$app->user->can('postComment',['comment'=>$comment])) { 
    $comment->post(); 
} else { 
    throw new ForbiddenHttpException('Sorry m8, you cant do this. No idea why tho!'); 
} 

E le grandi opere, ma come mostrato nell'esempio che davvero non hanno idea del perché l'utente non è in grado di pubblicare il commento. Può essere un numero qualsiasi di motivi, ad esempio perché il thread è bloccato o perché non hanno il permesso di postare in una certa categoria o perché non hanno una reputazione sufficientemente alta, ecc. Ma vogliamo dire all'utente perché! Quindi la mia domanda è, come otteniamo quel feedback dall'RBAC di Yii2?

+0

Normalmente RBAC fornisce l'eccezione 'Forbidden' quando l'utente non dispone dell'autorizzazione oppure è possibile scrivere un messaggio personalizzato o utilizzare try-catch. –

+0

RBAC in Yii2 non fa nulla del genere. Restituisce solo una risposta SÌ/NO (booleana). Spetta al programmatore lanciare un'eccezione basata su quelle informazioni minime. – mae

+0

Invia errore solo se l'utente non ha il permesso postComment. –

risposta

0

Si desidera creare il proprio AccessRule e impostare le eccezioni dei messaggi dai propri scenari sovrascrivendo i metodi correnti in quella classe. matchRole sarebbe il metodo che dovresti ignorare. Yii2 non ha questo posto in posizione, quindi dovrai eseguire il rollover del tuo AccessRule per farlo.

Poi una volta che il suo creato allegarlo al controller:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'ruleConfig' => [ 
       'class' => 'app\components\AccessRule' 
      ], 
      'rules' => [ 
       /* my normal rules */ 
      ], 
     ], 
    ]; 
} 
+0

Sfortunatamente questa non è veramente una opzione in quanto ho bisogno di usare il controllo delle autorizzazioni ovunque, non solo i controller (anche in bootstrap, componenti, widget, modelli, ecc.). – mae

+0

Tutti hanno comportamenti o possono avere comportamenti collegati. [BehaviorsGuide] (http://www.yiiframework.com/doc-2.0/guide-concept-behaviors.html) – tripskeet

1

Quindi, in pratica tutto quello che ho fatto è stato aggiungere

'message' => 'Current password cannot be blank.' 

per le mie regole.

Assicurati di separare le regole corrette, in modo da non ottenere quel messaggio su più campi, dove non ha senso. Assicurati inoltre di aggiungerlo alla regola "richiesta", a meno che tu non voglia che quel messaggio venga mostrato quando è un'altra regola ..

Spero che questo ti abbia aiutato, dato che ho passato un po 'troppo tempo a cercarlo.

+0

Ho appena realizzato che questa risposta riguarda le regole di convalida, che non ha nulla a che fare con la mia domanda lol. Ti sto chiedendo di aggiungere messaggi di feedback ** Oggetti regola RBAC **, non regole di convalida del modello. – mae

+1

Non rispondere alla domanda in alcun modo! – TheStoryCoder