Heim  >  Fragen und Antworten  >  Hauptteil

Die Laravel-Middleware kann nicht erkennen, dass der Benutzer angemeldet ist

Ich verwende Laravel 8 und möchte eine Middleware anwenden, um zu überprüfen, ob der Benutzer is_staffis_superuser auf 1 gesetzt hat. Dann kann er auf das Admin-Dashboard zugreifen, andernfalls kann er nicht darauf zugreifen.

Dazu habe ich Folgendes erstellt:

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('/');
        }
    }

Das Problem ist nun, dass es zurückkommt redirect('/'); was bedeutet, dass die Middleware nicht erkennt, dass der Benutzer angemeldet ist, er aber bereits angemeldet ist.

Ich habe die Middleware so registriert:

protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,

und habe es auf meine Admin-Route angewendet (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'));
        });
    }

Das ist die admin.php Route:

Route::get('/',function (){
    return view('admin.master');
});

Was ist hier also das Problem? Wie kann ich dieses Problem lösen?

P粉935883292P粉935883292181 Tage vor273

Antworte allen(2)Ich werde antworten

  • P粉354602955

    P粉3546029552024-03-26 21:14:39

    您没有显示整个路由,但我敢打赌您的使用永远不会被记录。

    您可能会申请:

    Route::middleware('auth.admin')
                    ->namespace($this->namespace)
                    ->prefix('admin')
                    ->group(base_path('routes/web/admin.php'));

    对于所有管理路由。因此,您有登录表单,当您填写登录数据时,用户会点击某个也应用此中间件的端点,因此它永远不会到达您实际登录用户的控制器,因为中间件重定向回 /。

    除了登录/提醒密码之外的所有路由都应该应用中间件,否则无法登录。

    Antwort
    0
  • P粉797004644

    P粉7970046442024-03-26 20:56:59

    我认为您还需要将 web 中间件添加到管理路由中。

    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() 尝试从会话中获取当前登录的用户。

    web 中间件组激活会话,它应用了一堆中间件

    //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,
     ],
    

    没有 web 中间件会话将不可用

    Antwort
    0
  • StornierenAntwort