问题
i am just trying to show a company to anyone who ants to see it authServiceProvider:
Company::class => CompanyPolicy::class ,
'App\Models\Company' => 'App\Policies\CompanyPolicy',
companyPolicy
public function view( Company $company)
{
return true ;
}
companyController
public function __construct(CompanyRepository $companies)
{
$this->companies = $companies;
}
public function show(Company $company)
{
$this->authorize('view', $company);
return $this->companyRepository->show($company);
}
route to controller:
Route::apiResource('companies', 'CompanyController');
it always return This action is unauthorized. why?
回答1:
The line of Company::class => CompanyPolicy::class, is redundant in your AuthServiceProvier and you have to remove it.
let me bring an example:
assume we have a model named SomeModel and have registered its policy. the policy has the method of view which check current user is able to call show method.
For Guard of api you may create a trait like below:
trait ApiTrait
{
/**
* Authorize a given action for the current user.
*
* @param mixed $ability
* @param mixed|array $arguments
* @return \Illuminate\Auth\Access\Response
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function authorizeApi($ability, $arguments)
{
if (!request()->user('api')->can($ability, $arguments)) {
abort(403, 'This action is unauthorized.');
}
}
}
then in your controller use it:
class ExampleController extends Controller
{
use ApiTrait;
public function show(SomeModel $something)
{
$this->authorize('view', $something);
return 'it workes';
}
}
pay attention you should protect your route with middleware of auth:api or else you will get error code 500 when calling the can method in ApiTrait.
来源:https://stackoverflow.com/questions/52126737/policy-returns-this-action-is-unauthorized-no-matter-what