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

Posted

技术标签:

【中文标题】对一条路由使用多个身份验证中间件【英文标题】:Using multiple authentication middlewares for one route 【发布时间】:2019-12-11 16:07:15 【问题描述】:

我有一个 API 方法的要求(由著名的包 tymon/jwt-auth 保护),我还需要能够使用基于基本会话的 web 中间件访问它。

我不想在api.phpweb.php 中重复该路线,即使这完全可行。

我尝试将两者都添加到路由中,但它们根本不起作用,例如:['auth:api', 'web'] 我还尝试创建一个新的中间件,目的是同时检查 apiweb,如下所示:

class CombinedAuth

    public function handle($request, Closure $next)
    
        $web = Auth::guard('web')->user();
        if ($web) 
            return $next($request);
        

        $api = Auth::guard('api')->user();
        if ($api) 
            return $next($request);
        

        if(!$web && !$api) 
            throw new AuthorizationException;
        
    

这也行不通。 api 中间件工作正常,但 web 中间件不能,它总是让我退出并重定向到登录页面。

那么在 Laravel 5.8 中是否有一种巧妙的方法可以同时使用 apiweb 中间件保护路由?

【问题讨论】:

编写您使用两个中间件创建的路由的代码 @GiacomoM 我已经写过了。 ['auth:api', 'web'] 作为 middleware 值。 您没有写出您创建的确切路线。无论如何尝试在网络中间件中放置一个 dd 以查看它是否正确调用。 @GiacomoM web 中间件是内置的,我无权访问该文件。 请问,为什么你需要一个路由同时有 api 和 web 中间件?或者你只是想让 apis 和 web 路由一起工作? 【参考方案1】:

您可以使用'auth:api,web' 来检查多个守卫。

【讨论】:

我刚刚用 Laravel 5.8 测试了它,它确实有效。

以上是关于对一条路由使用多个身份验证中间件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Route 中间件身份验证 [重复]

Laravel 多重身份验证 |路由中间件

nextjs 路由中间件进行身份验证

如何使 Express 路由默认需要身份验证?

在Laravel中使用Middleware进行身份验证

Node/Express 的 Passport 身份验证中间件 - 如何保护所有路由