我想构建一个给我特定对象的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。
答案 0 :(得分: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()
];
答案 1 :(得分:0)
我解决了Sanjay Chaudhari发表的简单评论!
不使用auth:api
确实导致了新问题。这样,策略将寻找Auth::user()
而不是auth()->guard('api')->user()
。因为我已通过令牌进行身份验证,所以Auth::user()
将为空。
我做了一个整体ApiController
,它执行以下操作:
class ApiController extends Controller {
/**
* Return the logged in user
*
* @return mixed
*/
public function getUser() {
return Auth::user() ?? auth()->guard('api')->user();
}
public function authorize($ability, $arguments = [])
{
return $this->authorizeForUser($this->getUser(), $ability, $arguments);
}
}
让我所有与Api相关的控制器扩展ApiController而不是通常的Controller。