2015-09-12 20 views
12

Sto cercando di trovare una soluzione RBAC efficiente e flessibile per la mia app. Ho fatto una piccola ricerca e penso di aver creato il seguente.Controllo di accesso basato su ruolo Laravel 5

Nel mio modello User ho:

... 
public function role() { 
     return $this->belongsToMany('App\Models\Role', 'user_roles'); 
    } 

    public function hasRole($role) { 
     if($this->role->where('name', $role)->first()) 
      return true; 
    } 
... 

E un esempio di utilizzo:

Route::group(['middleware' => 'auth'], function() { 

    Route::get('/dashboard', function() { 
     if (Auth::user()->hasRole('Sales')) { 
      return view('dashboards/sales'); 
     } else { 
      return 'Don\'t know where to send you :('; 
     } 
    }); 

}); 

Le autorizzazioni vengono assegnate ai ruoli, ma i permessi non vengono controllati nell'esempio di cui sopra. I ruoli vengono quindi assegnati agli utenti e un utente può avere molti ruoli.

È il modo in cui ho fatto le cose scalabili e una soluzione RBAC efficace?

+3

5.1.11 introdotto autorizzazione utilizzando le capacità e le politiche. Potrebbero soddisfare le vostre esigenze? http://laravel.com/docs/5.1/authorization .. potresti provare ENTRUST anche se https://github.com/Zizaco/entrust – e4rthdog

+0

Grazie, l'unica cosa che non ti dice come fare è come assegnare abilità a determinati utenti che utilizzano un database. – imperium2335

+0

Invece di controllare l'abilità tramite il modello utente ... http: //laravel.com/docs/5.1/authorization#defining-abilities – e4rthdog

risposta

3

Ho creato alcune app RBAC e dipende dal tipo di sfida che stai affrontando, ad es.

L'utente ha un ruolo ma si desidera che un utente specifico abbia accesso ad un'area, ad esempio Posts, ora l'utente può modificare i post come un Moderatore. L'approccio delle autorizzazioni in questo caso si adatta meglio di un semplice approccio di ruolo.

Definire l'accesso di una lumaca, gli altri campi possono essere utilizzati come riferimento per Super Admin, o ironicamente per un Editor Ruolo, a partire da ora, un ruolo di Editor, più permesso di una nuova "area".

public function up() 
{ 
    Schema::create('permissions', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->string('name'); 
     $table->string('slug')->unique(); 
     $table->string('description')->nullable(); 
     $table->string('model')->nullable(); 
    }); 
} 

Come esempio di dati di contenuto,

$createUsersPermission = Permission::create([ 
    'name' => 'Create permissions', 
    'slug' => 'create.permissions', 
    ... 
]); 

E un esempio di utilizzo:

if ($user->can('create.permissions') { // you can pass an id or slug 
    // 
} 

Personalmente preference, e mai utilizzato Zizaco Entrust come suggerito dalle altre persone, ma funziona nello stesso modo. Inoltre hai anche un approccio ai livelli.

3

Ho fatto un po 'diverso, ho fatto hasRole in UserRole, non è Utente (non ha un impatto eccessivo ma come dovrebbe essere il codice). Quindi Ecco il mio percorso:

Route::group(['middleware' => 'auth'], function() { 
Route::get('/myProfile', function() { 
    if (App\UserRole::hasRole('ROLE_CUSTOMER',Auth::user())) { 
     return view('views/customer'); 
    } else { 
     return 'Don\'t know where to send you :('; 
    } 
}); }); 

Next Thing è, il metodo nella mia UserRole. Ho cercato di mantenere le cose semplici:

public static function hasRole($authority,$user) { 
     $role = Role::where('authority',$authority)->first(); 
     $userRole = UserRole::where('role_id',$role->id) 
        ->where('user_id',$user->id)->first(); 
     if($userRole){ 
      return true; 
     } 
    } 

Cerchiamo l'autorità (ROLE_USER, ROLE_CUSTOMER ecc) e $ utente è oggetto utente recuperato dal DB. Tutto il resto funziona secondo la tua domanda/ Spero che aiuti! Cheers!

0

Poiché non esiste una soluzione pronta per l'autenticazione basata sui ruoli in laravel. È possibile creare una tabella ruolo personalizzata che definisca tutti i possibili ruoli che può avere l'applicazione e la tabella ruolo_user che contiene l'associazione di utente e ruoli.

È possibile creare metodi sotto il modello utente per verificare se l'utente appartiene a un ruolo particolare. Utilizzare questo metodo per registrare un nuovo middleware. Il middleware può essere addetto alle rotte o ai controller.

demo dettagliata è dato in questo link https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/