Maison > Questions et réponses > le corps du texte
J'utilise Laravel 8 et je souhaite appliquer un middleware pour vérifier si l'utilisateur a défini is_staff
或 is_superuser
sur 1, il peut alors accéder au tableau de bord d'administration, sinon il ne peut pas y accéder.
Pour ce faire, j'ai créé ceci :
public function handle($request, Closure $next) { if(Auth::check()) { if(auth()->user()->isSuperUser() || $request->user()->isStaffUser()) { return $next($request); }else{ return redirect('/home'); } }else{ return redirect('/'); } }
Maintenant, le problème est qu'il renvoie redirect('/');
ce qui signifie que le middleware ne reconnaît pas que l'utilisateur est connecté, mais il est déjà connecté.
J'ai enregistré le middleware comme ceci :
protected $routeMiddleware = [ ... 'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,
et je l'ai appliqué à ma route admin (RouteServiceProvider.php
) :
public function boot() { $this->configureRateLimiting(); $this->routes(function () { ... Route::middleware('auth.admin') ->namespace($this->namespace) ->prefix('admin') ->group(base_path('routes/web/admin.php')); }); }
Voici le admin.php
itinéraire :
Route::get('/',function (){ return view('admin.master'); });
Alors, quel est le problème ici ? Comment puis-je résoudre ce problème?
P粉3546029552024-03-26 21:14:39
Vous n'affichez pas l'intégralité de l'itinéraire, mais je parie que votre utilisation ne sera jamais enregistrée.
Vous pouvez postuler pour :
Route::middleware('auth.admin') ->namespace($this->namespace) ->prefix('admin') ->group(base_path('routes/web/admin.php'));
Pour toutes les voies de gestion. Vous avez donc le formulaire de connexion et lorsque vous remplissez les données de connexion, l'utilisateur atteint un point de terminaison sur lequel ce middleware est également appliqué, de sorte qu'il n'atteint jamais votre contrôleur où l'utilisateur est réellement connecté, car le middleware redirige vers /.
Tous les itinéraires, à l'exception du mot de passe de connexion/rappel, doivent appliquer un middleware, sinon la connexion ne peut pas être effectuée.
P粉7970046442024-03-26 20:56:59
Je pense que vous devez également ajouter le middleware web
à la route d'administration.
public function boot() { $this->configureRateLimiting(); $this->routes(function () { ... Route::middleware(['web', 'auth.admin']) ->namespace($this->namespace) ->prefix('admin') ->group(base_path('routes/web/admin.php')); }); }
Auth::check()
Essayez d'obtenir l'utilisateur actuellement connecté de la session.
web
Le groupe middleware active la session, qui applique un tas de middleware
//app/Http/Kernel.php 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
Sans web
les sessions middleware ne seront pas disponibles