Maison  >  Questions et réponses  >  le corps du texte

Le middleware Laravel ne peut pas reconnaître que l'utilisateur est connecté

J'utilise Laravel 8 et je souhaite appliquer un middleware pour vérifier si l'utilisateur a défini is_staffis_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粉935883292P粉935883292231 Il y a quelques jours361

répondre à tous(2)je répondrai

  • P粉354602955

    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.

    répondre
    0
  • P粉797004644

    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

    répondre
    0
  • Annulerrépondre