我有一个处理API调用的控制器。用户可能具有不同的角色。根据他的角色,他可能会访问API的某些部分。
中间件
class CheckUserRole
{
public function handle($request, Closure $next, string $role)
{
if(\Auth::check()) {
:
}
}
}
尽管我使用登录用户来调用API,但是却得到了null。在$request
参数中,我都没有用户。我该怎么办?
答案 0 :(得分:0)
正如你们中提到的那样,api调用不会启动会话,我想这是为了避免CSRF攻击。
一种解决方案是使用passport:
Laravel使用Laravel Passport使API身份验证变得轻而易举,它可以在几分钟内为您的Laravel应用程序提供完整的OAuth2服务器实现。
另一种可能更脆弱(但就我而言已足够好)的解决方案是在api调用上启动会话。为此,您需要修改app/Http/Kernel.php
:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
并将以下中间件添加到'api'
条目中:
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
(我从this brief article获得了此解决方案)