2015-10-14 12 views
6

Scenario seguente:Usa built-in rbac o build proprio?

Ho un'applicazione web multi tenant in modello avanzato Yii2 '.

Questa applicazione ha tre portali:
- backend
- dashboard
- frontend

Ogni portale ha la sua tabella utente per l'autenticazione.
(-frontend_user,
-dashboard_user,
-backend_user)

Frontend e cruscotto possono raggiunto con il nome del conduttore, alla fine, ad esempio:

Quando un utente tenta di accedere al cruscotto o frontend I controllare se hanno il diritto di accedere. Questo accade tramite tabella di contingenza (es .: dashboard_user_tenant)

Ora voglio costruire un RBAC per l'applicazione cruscotto.

Ma i ruoli non devono essere bloccati all'utente del dashboard ma a dashboard_user_tenant (la tabella di contingenza), poiché i diritti possono cambiare nel dashboard di ciascun titolare.

Yii2 ha il proprio sistema rbac, ma come ho capito finora, non si adatta alle mie esigenze.

Eventuali possibilità di personalizzare rbac di Yii2 o è preferibile creare una soluzione personalizzata? Forse il mio componente?

Spero che la mia descrizione è abbastanza chiara :)

risposta

3

ho avuto un desiderio simile in uno dei miei progetti, ma non ho creato il mio sistema completo RBAC, invece mi ha sovrascritto un modo di controllare per i ruoli

Nella classe Componente utente, estendo \ yii \ web \ Utente e sovrascrivo anche la funzione can() di quella classe. Questo mi consente di usare il mio modo di verificare le autorizzazioni appropriate. Per esempio

<?php 

namespace app\modules\users\models; 

use Yii; 
use yii\web\User as WebUser; 

use app\modules\users\models\UserPermissionManager; 

class User extends WebUser 
{ 
    public function can($operation, $params = [], $allowCaching = true) 
    { 
     if(Yii::$app->user->isGuest) 
     { 
      return false; 
     } 

     return (new UserPermissionManager())->has($operation); 
    } 
} 

Nella classe UserPermissionManager, interroga una tabella di database che è pieno di permessi come "utenti: accesso", "gli utenti: edit", ecc

Tutti hanno un certo livello di utente assegnato a loro che si riferisce al livello utente che ho impostato nella tabella del mio database degli utenti.

Tutta la funzione can() deve restituire true o false, a seconda che l'utente abbia il permesso di fare ciò che viene chiesto. Puoi gestire questo comunque ti piace davvero.

È un sistema abbastanza grande da spiegare completamente in un post, ma spero che sia stato leggermente aiutato, sentitevi liberi di farmi sapere se posso spiegare meglio qualsiasi cosa!

+0

Grazie per la risposta! Penso di dover andare in un modo simile. È una buona idea sovrascrivere la funzione "can". –

+0

Nessun problema, lo trovo davvero utile perché ti permette di determinare se gli utenti possono accedere alle pagine usando qualunque metodo tu voglia! Sentiti libero di farmi sapere se hai bisogno di qualcos'altro! – Lynch