Comment rediriger en fonction du rôle de l'utilisateur en utilisant un middleware?


Amarja

Je fais un projet à laravel. Je souhaite rediriger l'utilisateur en fonction de son rôle.

Mes tables sont,

table utilisateur comportant des champs (id, nom, mot de passe).

table de rôle ayant des champs (id, rôle).

assigned_role tables ayant des champs (id, role_id, user_id).

J'ai le modèle utilisateur comme,

User.php

public function roles()
{
    return $this->belongsToMany('App\Role', 'assigned_roles', 'user_id', 'role_id');
}

Pour cela, j'ai créé un middleware nommé 'RoleMiddleware'

RoleMiddleware:

public function handle($request, Closure $next)
{
    $roles = $request->user()->roles;
    foreach ($roles as $role) {
        if($role->name != 'super-admin')
            return redirect('/user');
    }

    return $next($request);
}

J'ai ce middleware dans le fichier kernel.php,

Kernel.php ressemble à,

 protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'role' =>   \App\Http\Middleware\RoleMiddleware::class,

];

mais maintenant je ne sais pas comment utiliser ce middleware. Lorsque j'ajoute ce middleware dans le fichier Route.php en tant que,

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

    Route::auth();
    Route::group(['middleware' => 'role'], function () {
        Route::get('/home', '[email protected]');
        Route::get('/user', '[email protected]');

    });
});

Mais lorsque je me suis connecté, il redirige vers l'URL correcte. Mais maintenant, il peut donner accès aux pages intérieures sans vérifier si l'utilisateur est connecté ou non. Alors que lorsque je commente la partie RoleMiddleware, cela empêche d'accéder aux pages intérieures à moins que l'utilisateur ne se connecte.

Je ne sais pas comment faire ça.

Henrik

Si je vous ai bien compris:

  • Vous souhaitez restreindre les utilisateurs qui n'ont pas le rôle de super-administrateur (qu'ils soient authentifiés ou non) pour les empêcher d'accéder à une certaine URL.
  • Vous essayez également de rediriger les utilisateurs authentifiés qui n'ont pas le rôle de super-administrateur vers l'URL /user.

Corriger?

Voici comment procéder:

Dans votre fichier routes.php, vous devez fournir des routes pour l'utilisateur super-administrateur et les utilisateurs authentifiés (sans rôle de super-administrateur)

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

    Route::auth();

    Route::group(['middleware' => ['auth', 'role']], function () {
        // All routes you put here can only be accessible to users with super-admin role

    });

    Route::group(['middleware' => 'auth'], function () {
        // All routes you put here can be accessible to all authenticated users

    });
});

Et dans votre rôle middleware, vous devez empêcher les utilisateurs authentifiés sans le rôle superadmin d'accéder à l'url donnée, dans ce cas en les redirigeant simplement vers une autre URL

public function handle($request, Closure $next)
{
    $roles = $request->user()->roles;
    foreach ($roles as $role) {
        if($role->name == 'super-admin')
            // If user is super-admin, accept the request
            return $next($request);
    }
    // If user does not have the super-admin role redirect them to another page that isn't restricted
    return redirect('/user');        
}

Articles connexes