Dans mon application, j'ai trois rôles d'utilisateur:
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.
3 Réponses :
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. }); });
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
Merci pour votre réponse. Je vais vérifier les liens.
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, ];