在路由组上设置默认保护

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”保护。

以上是关于在路由组上设置默认保护的主要内容,如果未能解决你的问题,请参考以下文章

javascript 带保护的路由器默认配置

每天一点点之vue框架开发 - vue-router路由进阶(路由别名跳转设置默认路由)

airos默认密码

为Linux新增静态路由的方法

怎么设置路由器ip地址默认网关呢

win7默认路由怎么设置