我想构建一个API端点,它给我一个特定的对象。某些对象是公开可用的,有些对象只能由该对象的所有者查看,直到它们发布该对象为止。
Route::get('jobs/{job}', 'JobController@find')->middleware('auth:api');
JobPolicy应该决定应该发生什么:
public function view(User $user, Job $job)
{
if (!empty($user)) {
return $job->user_id === $user->id || $job->job_status_id !== 1;
}
return true;
}
这在用户登录时有效。当用户不登录时,这不再起作用。
像这样,->middleware('auth:api')
可以防止在未登录时访问该策略。
根据this question和this doc,我必须能够将策略中的视图方法从view(User $user, Job $job)
更改为view(?User $user, Job $job)
,以便达到我的策略,即使对于未经过身份验证的用户也是如此。
问题是,因为->middleware('auth:api')
它不断发送给我app\Exceptions\Handler.php
与未经验证的错误。
明确加入?到JobPolicy不是我应该做的唯一事情。
我正在运行PHP 7.2,Laravel 5.7和Laravel Passport 7.2.0。
我现在正在使用Passport。在Postman标题上添加这个解决了我的问题。希望这对你也有帮助
Key Value
===================================
Accept application/json
Authorization Bearer {insert_token_login_here}
用户登录时可以生成令牌。这是我的LoginController
$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
if ($request->remember_me)
{
$token->expires_at = Carbon::now()->addWeeks(1);
}
$token->save();
$message = ['user' => $user,
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse(
$tokenResult->token->expires_at
)->toDateTimeString()
];
感谢Sanjay Chaudhari发布的简单评论,我解决了!
不使用qazxsw poi确实引起了一个新问题。这样政策将寻找qazxsw poi而不是auth:api
。因为我通过令牌进行身份验证,Auth::user()
将为空。
我做了一个整体auth()->guard('api')->user()
,做了以下事情:
Auth::user()
让我所有与Api相关的控制器扩展ApiController而不是通常的Controller。