我是Laravel的新手,几天来一直在追踪它的代码以了解其行为,但无济于事。
假设我将中间件添加到这样的路由
Route::group(["middleware" => ["web", "auth:web", "auth:custom"]], function() {
Route::view("/about", "about");
});
/about
路线是否先经过auth:web
,然后经过auth:custom
?
如果没有,那是什么行为?
如何创建与auth:custom
不冲突的auth:web
防护?当前的行为是,如果auth:web
被认证,auth:custom
遵循其状态,我怀疑它们共享相同的会话变量。
我真的是Laravel的新手,这似乎是路由,身份验证和中间件的结合。希望有人能指出正确的方向。谢谢。
答案 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:web
和auth: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.php
,guards
数组下进行定义:
'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:custom
或auth:acme
)进行身份验证。