Le middleware Laravel ne peut pas reconnaître que l'utilisateur est connecté
P粉935883292
P粉935883292 2024-03-25 23:18:57
0
2
365

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粉935883292
P粉935883292

répondre à tous(2)
P粉354602955

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粉797004644

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal