2
votes

Laravel Group Multiple Middleware

Dans mon application, j'ai trois rôles d'utilisateur:

  1. utilisateur
  2. éditeur
  3. administrateur

Lorsque l'éditeur se connecte à la section admin, certaines des sections sont masquées (les utilisateurs gèrent, les informations système, etc.) et bien sûr, l'administrateur peut tout voir.

Donc, pour dans ce but, j'ai créé deux middleware: Admin et Editor. Voici le code.

Intergiciel d'administration.

Route::middleware(['admin', 'editor'])->group(function(){

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

Intergiciel de l'éditeur:

Route::middleware('admin')->group(function(){

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

Voici le partie du noyau:

protected $routeMiddleware = [

'admin' => \App\Http\Middleware\Admin::class,
'editor' => \App\Http\Middleware\Editor::class,

];

J'essaye maintenant de construire les routes qui seront disponibles pour ces rôles d'utilisateur. Si je le fais uniquement pour l'administrateur ou l'éditeur, cela fonctionne bien, mais lorsque je les combine, un utilisateur peut se connecter et l'autre pas.

Voici le code uniquement pour l'administrateur et cela fonctionne très bien .

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Editor
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 2) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

J'ai essayé de les combiner avec ce code, mais cela ne fonctionne pas (je ne peux pas du tout me connecter à la section d'administration):

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 3) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

Comment puis-je résoudre ce problème?

PS Plus tard, je souhaite également créer une logique pour le rôle utilisateur, il y a donc un moyen de combiner les itinéraires.


0 commentaires

3 Réponses :


1
votes

Ce devrait être comme ci-dessous.

Route::middleware(['auth'])->group(function(){
//common routes will goes here

   Route::middleware(['admin'])->group(function(){//admin routes will goes here
      Route::get('/admin', 'PagesController@adminIndex');
      Route::resource('/admin/pages', 'PagesController');
      Route::resource('/admin/news', 'NewsController');
      Route::resource('/admin/users', 'UsersController');
   });

    Route::middleware(['editor'])->group(function(){
       //editor routes goes here.
    });


});


0 commentaires

0
votes

Le problème est que votre middleware (['admin', 'editor']) vérifie les deux rôles, c'est-à-dire admin, éditeur pour l'utilisateur et vous n'en avez qu'un rôle pour l'utilisateur. C'est la raison pour laquelle cela ne fonctionne pas

Il existe d'excellents packages pour gérer les rôles des utilisateurs qui sont faciles à utiliser. Je vous suggère d'utiliser Spatie Laravel Permission si vous voulez des didacticiels à ce sujet regardez Vidéo Bitfumes


1 commentaires

Merci pour votre réponse. Je vais vérifier les liens.



6
votes

Vous pouvez résoudre le problème à l'aide de Paramètres middleware et au lieu de plusieurs les middlewares pour chaque rôle utilisent un seul middleware universel avec des rôles comme paramètres.

Par exemple:

Route::middleware(['checkRole:admin,editor'])->group(function(){
  //Your routes  
});

Middleware: strong >

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, ...$roles)
    {
        $roleIds = ['user' => 1, 'editor' => 2, 'admin' => 3];
        $allowedRoleIds = [];
        foreach ($roles as $role)
        {
           if(isset($roleIds[$role]))
           {
               $allowedRoleIds[] = $roleIds[$role];
           }
        }
        $allowedRoleIds = array_unique($allowedRoleIds); 

        if(Auth::check()) {
          if(in_array(Auth::user()->role_id, $allowedRoleIds)) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

Itinéraires:

protected $routeMiddleware = [
   'checkRole' => \App\Http\Middleware\CheckRole::class,
];


0 commentaires