Laravel 5.7身份验证行为

时间:2018-12-24 11:07:32

标签: laravel authentication middleware

我是Laravel的新手,几天来一直在追踪它的代码以了解其行为,但无济于事。

假设我将中间件添加到这样的路由

Route::group(["middleware" => ["web", "auth:web", "auth:custom"]], function() {
    Route::view("/about", "about");
});
  1. /about路线是否先经过auth:web,然后经过auth:custom? 如果没有,那是什么行为?

  2. 如何创建与auth:custom不冲突的auth:web防护?当前的行为是,如果auth:web被认证,auth:custom遵循其状态,我怀疑它们共享相同的会话变量。

我真的是Laravel的新手,这似乎是路由,身份验证和中间件的结合。希望有人能指出正确的方向。谢谢。

1 个答案:

答案 0 :(得分:1)

1-您的路线将使用App\Providers\RouteServiceProvider中的中间件。参见:

/**
 * Define the "web" routes for the application.
 *
 * These routes all receive session state, CSRF protection, etc.
 *
 * @return void
 */
protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

您编写的每个中间件都将按照您定义的顺序执行。如果一个中间件失败,则不会调用$next($request);。因此,下一个中间件将不会被激活。

2-这些auth:webauth:custom中间件是“身份验证中间件”调用,但是具有不同的参数。 :之后的所有内容都将作为参数发送到处理中间件的方法。

auth中间件在App\Http\Kernel var下的$routeMiddleware类下定义:

'auth' => \Illuminate\Auth\Middleware\Authenticate::class,

这是handle方法:

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string[]  ...$guards
 * @return mixed
 *
 * @throws \Illuminate\Auth\AuthenticationException
 */
public function handle($request, Closure $next, ...$guards)
{
    $this->authenticate($guards);

    return $next($request);
}

您的“网络”或“自定义”参数进入... $ guards参数。

顺便说一句,没有预定义的“自定义”防护。您必须编写自己的自定义防护,并在config/auth.phpguards数组下进行定义:

'guards' => [
    'web' => [ // This is the web guard (auth:web)
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [ // and this the api guard (auth:api)
        'driver' => 'token',
        'provider' => 'users',
    ],
],

然后,您可以期望laravel auth中间件使用您的自定义防护(例如auth:customauth:acme)进行身份验证。