我在15 -swagger配置中添加了中间件,并试图打印出用户对象,但它返回null。
是否有可能限制特定的或所有API/文档生成的swagger使用角色和权限定义在Laravel内部?
编辑这是中间件,这里没有什么特别的。我只是想检查用户是否存在,但是失败了。
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class ApiDocumentationAuthCheck
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure(IlluminateHttpRequest):
(IlluminateHttpResponse|IlluminateHttpRedirectResponse) $next
* @return IlluminateHttpResponse|IlluminateHttpRedirectResponse
*/
public function handle(Request $request, Closure $next)
{
dd(Auth()->user());
// if auth User allow access to API
return $next($request);
// else redirect to Login route with auto redirect back
}
}
在15 -swagger配置中,我像这样设置中间件
'middleware' => [
'api' => ['ApiDocumentationAuthCheck'],
'asset' => [],
'docs' => [],
'oauth2_callback' => [],
],
无论您是否登录,您的用户返回null都是正常的,因为15 -swagger文档的路由是分开处理的(意思是:它们不通过web或api路由),这意味着没有预定义的中间件(包括处理身份验证的中间件)
要使它工作,你需要把所有的中间件用于你的路由:默认为web或api
'middleware' => [
'api' => [
'api', // or 'web' if you are using web routes
'ApiDocumentationAuthCheck',
],
'asset' => [],
'docs' => [],
'oauth2_callback' => [],
],
现在可以访问Auth::user()
注意:这里的顺序很重要,因为请求按顺序通过中间件,默认中间件用于检查会话并在必要时初始化它们。
在我的例子中,我测试如果用户没有身份验证,那么我验证它:
$user = Auth::user(); //get authenticated user
if (empty($user)) { //if no user is authenticated then manually log him
return response()->redirectTo("/api/login?intended=/api/documentation");
}
if ($user->role == 'admin') {
throw new UnauthorizedException("You do not have the necessary access to perform this action (Documentation Access).");
}