web-dev-qa-db-fra.com

Laravel Contrôle d'accès basé sur 5 rôles

J'essaie de trouver une solution RBAC efficace et flexible pour mon application. J'ai fait une petite recherche et pense avoir créé ce qui suit.

Dans mon modèle d'utilisateur, j'ai:

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

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

Et un exemple d'utilisation:

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 :(';
        }
    });

});

Les autorisations sont attribuées aux rôles, mais les autorisations ne sont pas vérifiées dans l'exemple ci-dessus. Les rôles sont ensuite attribués aux utilisateurs et un utilisateur peut avoir plusieurs rôles.

Ma façon de faire les choses est-elle évolutive et constitue-t-elle une solution RBAC efficace?

13
imperium2335

J'ai créé des applications RBAC, et cela dépend du type de défi auquel vous êtes confronté, par exemple.

Les utilisateurs ont un rôle, mais vous souhaitez qu'un utilisateur spécifique ait accès à une zone, telle que Posts. Cet utilisateur peut désormais modifier les publications de type Modérateur . Dans ce cas, l’approche des autorisations convient mieux qu’une approche par rôle. 

Définir l'accès par un slug, les autres champs peuvent être utilisés comme référence à Super Admin , ou ironiquement pour un Rôle d'éditeur , à partir de maintenant, un rôle d'éditeur plus une autorisation de nouveau " surface". 

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();
    });
}

À titre d'exemple de données de contenu,

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

Et un exemple d'utilisation:

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

Personnellement préférence , et jamais utilisé Zizaco Entrust comme suggéré par les autres personnes, mais cela fonctionne de la même manière. Vous avez aussi une approche de niveaux aussi.

3
AndreL

J'ai fait un peu différent, j'ai fait hasRole dans UserRole, ce n'est pas User (cela n'a pas d'impact trop, mais selon le code, cela devrait être). Alors voici mon itinéraire:

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 :(';
    }
}); });

La prochaine chose est, la méthode dans mon UserRole. J'ai essayé de garder les choses simples:

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;
        }
    }

Nous recherchons l'autorité (ROLE_USER, ROLE_CUSTOMER, etc.) et $ user est un objet utilisateur extrait de la base de données. Tout le reste fonctionne selon votre question / J'espère que ça aide! A la votre!

3
89n3ur0n

Comme il n’existe pas de solution prête à l’emploi pour l’authentification basée sur les rôles dans laravel. Vous pouvez créer une table de rôles personnalisée définissant tous les rôles possibles de votre application et une table role_user contenant l'association des rôles et des utilisateurs. 

Vous pouvez créer des méthodes sous votre modèle utilisateur pour vérifier si l'utilisateur appartient à un rôle particulier. Utilisez cette méthode pour enregistrer un nouveau middleware. Le middleware peut être attaché à des routes ou à des contrôleurs.

Une démonstration détaillée est donnée dans ce lien https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/

0
Tushar