Laravel 中间件无法识别用户已登录
Laravel middleware does not recognize user is logged in
我正在使用 Laravel 8,我想应用一个中间件来检查用户是否将 is_staff
或 is_superuser
设置为 1, 然后他可以访问管理仪表板,否则他无法访问它。
所以为了做到这一点,我创建了这个:
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('/');
}
}
现在的问题是 returns redirect('/');
这意味着中间件无法识别用户已经登录,但是他已经登录了。
我是这样注册中间件的:
protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,
并将其应用于我的管理路由 (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'));
});
}
这是 admin.php
路线:
Route::get('/',function (){
return view('admin.master');
});
那么这里出了什么问题?我该如何解决这个问题?
你没有显示整个路由,但我打赌你的使用永远不会被记录。
您可能申请:
Route::middleware('auth.admin')
->namespace($this->namespace)
->prefix('admin')
->group(base_path('routes/web/admin.php'));
对于所有管理路由。所以你有登录表单,当你填写数据登录时,用户会点击一些也应用这个中间件的端点,所以它永远不会进入你实际登录用户的控制器,因为中间件重定向回 /.
除login/remind密码外,所有路由都应使用中间件,否则无法登录。
我认为您还需要将 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
中间件组激活session,应用了一堆中间件
//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
中间件会话将不可用
我正在使用 Laravel 8,我想应用一个中间件来检查用户是否将 is_staff
或 is_superuser
设置为 1, 然后他可以访问管理仪表板,否则他无法访问它。
所以为了做到这一点,我创建了这个:
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('/');
}
}
现在的问题是 returns redirect('/');
这意味着中间件无法识别用户已经登录,但是他已经登录了。
我是这样注册中间件的:
protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,
并将其应用于我的管理路由 (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'));
});
}
这是 admin.php
路线:
Route::get('/',function (){
return view('admin.master');
});
那么这里出了什么问题?我该如何解决这个问题?
你没有显示整个路由,但我打赌你的使用永远不会被记录。
您可能申请:
Route::middleware('auth.admin')
->namespace($this->namespace)
->prefix('admin')
->group(base_path('routes/web/admin.php'));
对于所有管理路由。所以你有登录表单,当你填写数据登录时,用户会点击一些也应用这个中间件的端点,所以它永远不会进入你实际登录用户的控制器,因为中间件重定向回 /.
除login/remind密码外,所有路由都应使用中间件,否则无法登录。
我认为您还需要将 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
中间件组激活session,应用了一堆中间件
//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
中间件会话将不可用