Recentemente stavo cercando una soluzione per proteggere alcune route di un’applicazione Laravel attraverso un sistema basato su Ruoli. Nella ricerca mi sono imbattuto in diversi pacchetti tra cui romanbican/roles, kodeine/laravel-acl o Sentinel. Senza considerare che lo stesso Taylor Otwell ha introdotto il Trait Authorizable da Laravel 5.1.11.

Tutte ottime soluzioni, eppure nessuna offre la semplicità d’uso e personalizzazione che stavo cercando… Ho quindi deciso di cimentarmi nella realizzazione di un package indipendente partendo da alcuni semplici presupposti. Il pacchetto doveva:

  1. implementare solo le funzionalità di base con la possibilità di estenderle/personalizzarle a piacimento;
  2. essere facilmente modificabile/rimpiazzabile attraverso l’uso di contratti;
  3. offrire delle API semplici e ben documentate.

Dopo qualche giorno di lavoro sono lieto di presentarvi Rooles.

Rooles è un RBAC (Role based access control) pensato specificatamente per Laravel >= 5.1 che permette di assegnare ad ogni utente un ruolo. Ruolo che a sua volta mette a disposizione dell’utente una serie di permessi, registrati in un apposito file di configurazione. Una volta installato, come indicato sulla pagina del progetto è sufficiente modificare il file config/rooles.php come segue:

[
    'roles' => [
        'admin' => [
            'name' => 'Amministratore',
            'grant' => '*'
        ],
        'editor' => [
           'name' => 'Editore',
           'grant' => [
                'posts.*',
                'comments.*',
                'profile.*'
            ],
            'deny' => [
                'posts.delete',
                'comments.delete'
            ]
        ]
    ]
];

E successivamente verificare se un dato utente ha accesso ai permessi con una sintassi semplicissima. Un esempio?

$user = User::find(9);
if ($user->can('comments.approve')) {
    // Do something
}
if ($user->role->is('admin')){
    // Do something
}

Grazie all’integrazione con Laravel è poi possibile sfruttare i Middleware provvisti per proteggere l’accesso a routes e controller, vediamo come:

Route::get('admin/users/', [
    'middleware' => [
        'auth',
        'role:admin|editor', // Give access to both admins and editors
    ],
    function () {
        return view('admin.users.index');
    }
]);

Ancora più semplice proteggere alcuni metodi di un controller indicando nel loro costruttore:

public function __construct()
{
    $this->middleware('perms:comments.create', ['only' => ['create', 'store']]);
    $this->middleware('perms:comments.read', ['only' => ['index', 'show']]);
    $this->middleware('perms:comments.update', ['only' => ['update', 'edit']]);
    $this->middleware('perms:comments.delete', ['only' => ['destroy']]);
}

Come potete vedere niente di più semplice.

Per la sua semplicità Rooles si propone quindi non solo come un sistema di gestione di ruoli e permessi funzionale ma anche come base di partenza per creare un vostro RBAC personalizzato. Spero che possa esservi d’aiuto nel prossimo progetto. Vi rimando alla pagina del progetto e buon lavoro!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *