Laravel 多重身份验证保护路由多个中间件不起作用

Posted

技术标签:

【中文标题】Laravel 多重身份验证保护路由多个中间件不起作用【英文标题】:Laravel multi auth protecting route multple middleware not working 【发布时间】:2019-01-19 22:27:41 【问题描述】:

我创建了一个额外的中间件管理员,我想保护我的路由。添加一个中间件 'auth' 或 'auth:admin' 正在工作。

Route::get('/calendar', function () 
    return view('app', ['data' => []);
)->middleware('auth');

但我希望作为管理员,您也可以访问用户路由,但这不起作用。如果我尝试以下操作,并以管理员身份登录,我会一直被重定向到登录页面。

Route::get('/information', ['middleware' => ['auth', 'auth:admin'], function () 
    return view('app', ['data' => ['auth' => Auth::check()]]);
]);

但如果我将 ['auth', 'auth:admin'] 更改为 ['auth:admin','auth'] 它适用于管理员,但不适用于用户。所以似乎只有我的中间件在数组中的第一个元素被识别。有谁知道为什么我的多个中间件单独工作而不是一起工作?任何帮助表示赞赏

【问题讨论】:

您的自定义中间件是什么样的?还是你的意思是警卫? 您似乎在“中间件”属性上缺少一个结束“]” 打错字了 【参考方案1】:

如果您尝试允许检查多个“守卫”的路线,您可以将多个守卫作为参数传递给Authenticate 中间件auth

auth:web,admin(假设web 是您的默认守卫)。

这将尝试从每个传入的守卫中解析用户 (Authenticatable)。如果任何守卫返回用户 (Authenticatable),则您通过身份验证。如果不是,你就是客人。

如果您设置了中间件 authauth:admin,它们是堆栈中不相关的 2 个独立“中间件”。

【讨论】:

谢谢!这正是我想要的。【参考方案2】:
Route::get('/information', ['middleware' => ['auth', 'auth:admin'],function () 
    return view('app', ['data' => ['auth' => Auth::check()]]);
]);

在这段代码中。 ['auth', 'auth:admin'] 这意味着您需要登录默认保护和管理员保护。如果您只需要登录管理员保护,['auth:admin']

【讨论】:

以上是关于Laravel 多重身份验证保护路由多个中间件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

对一条路由使用多个身份验证中间件

Laravel 5路由的多个中间件不起作用

在 laravel 中使用中间件保护路由

Laravel 在身份验证异常时自动重定向

Laravel 5.6 上的 Ajax 身份验证重定向

Laravel 5 中间件身份验证总是失败并重定向到登录