在路由组上设置默认保护
Posted
技术标签:
【中文标题】在路由组上设置默认保护【英文标题】:Setting the default guard on a route group 【发布时间】:2018-03-02 14:52:29 【问题描述】:我为我的用户设置了一个 API 令牌,他们可以在访问 API 路由以返回其他数据时选择提供该令牌。
这是我的 auth.php 配置:
'defaults' => [
'guard' => 'web',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'eloquent',
],
'api' => [
'driver' => 'token',
'provider' => 'eloquent',
],
],
我的代码中有各种(共享)位置,它们使用$request->user()
之类的检查而没有提供保护。问题是这总是使用默认的守卫。
但是,如果我将其中一个 API 路由设置为使用中间件 auth:api
,那么它会按照我的预期默认使用 api 防护。但我无法真正设置它,因为正如我所提到的,身份验证是可选的,并且使用 auth 中间件使其成为强制性的。
我想知道是否有办法设置所有 API 路由,以便它们的默认保护是 API 保护。
【问题讨论】:
供参考,还有mattallan.me/posts/setting-the-guard-per-route-in-laravel 【参考方案1】:对我来说,最简单的方法是添加到 Api\Controller(扩展所有类的那个),以下行:
public function __construct()
// We set the guard api as default driver
auth()->setDefaultDriver('api');
【讨论】:
正是我需要的。我认为这是最好的解决方案。简单干净 如果您使用 ide helper,Auth::setDefaultDriver('api')
也可以工作。【参考方案2】:
经过一番折腾,我想我已经找到了我认为合理的解决方案:
我创建了以下中间件:
class GuardSwitcher
public function handle($request, \Closure $next, $defaultGuard = null)
if (in_array($defaultGuard, array_keys(config("auth.guards"))))
config(["auth.defaults.guard" => $defaultGuard]);
return $next($request);
然后我将其添加为路由中间件:
protected $routeMiddleware = [
// ... more
'guardswitcher' => GuardSwitcher::class
];
然后我在Kernel.php
的 api 中间件堆栈中添加了这个中间件,即:
'api' => [
'guardswitcher:api',
// ... more
],
在此过程之后,Kernel.php
将如下所示:
class Kernel extends HttpKernel
protected $middleware = [
//These are the global framework middleware which were not changed
];
protected $middlewareGroups = [
'web' => [
//Web middleware, no changes here
],
'api' => [
'guardswitch:api',
// Other group middleware
]
];
protected $routeMiddleware = [
// Other middleware go here
'guardswitch' => DefaultGuardSwitch::class, // This is what's added
];
【讨论】:
你能稍微澄清一下这个答案吗你说I then added this as a route middleware
这应该去哪里然后你说stack in Kernel.php
你的意思是'api' => [ 'throttle:60,1', 'bindings', ],
顺便说一句我正在使用Laravel 5.4
@YousefAltaf 我添加了我的Kernel.php
的骨架轮廓,其中只有更改的部分。我没有删除我的 Kernel.php 中已经存在的任何内容。【参考方案3】:
我相信这会达到同样的效果。
内核
//...
'api' => [
//...
GuardSwitcher::class
],
Guard Switcher 中间件
class GuardSwitcher
public function handle($request, Closure $next)
if (auth()->getDefaultDriver() == 'web')
auth()->setDefaultDriver('api');
return $next($request);
现在将为来自 api 路由文件或 api 组内的所有传入请求设置默认驱动程序。
【讨论】:
【参考方案4】:如果我理解正确,您可以使用Route-Groups。
在本例中,路由组中的所有路由都必须通过 auth 中间件。
Route::group( [ 'middleware' => 'auth' ], function()
Route::get('/page', 'Controller@function');
);
【讨论】:
这对我不起作用,因为它将强制组中的所有路由仅在用户通过身份验证时才起作用。我想要的是该组中的所有路由默认检查用户是否在“API”保护上进行了身份验证,但目前他们默认使用“web”保护。以上是关于在路由组上设置默认保护的主要内容,如果未能解决你的问题,请参考以下文章