代码之家  ›  专栏  ›  技术社区  ›  Vahid Saberi

策略返回无论发生什么,此操作都是未经授权的

  •  -1
  • Vahid Saberi  · 技术社区  · 7 年前

    authServiceProvider:

            Company::class => CompanyPolicy::class ,
    'App\Models\Company' => 'App\Policies\CompanyPolicy',
    

    公司政策

     public function view( Company $company)
    {
    
        return true ;
    }
    

    公司控制器

     public function __construct(CompanyRepository $companies)
    {
        $this->companies = $companies;
    }
    
    
    public function show(Company $company)
    {
        $this->authorize('view', $company);
    
        return $this->companyRepository->show($company);
    }
    

    路由到控制器:

    Route::apiResource('companies', 'CompanyController');
    

    它总是返回此操作未经授权。为什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mohammad Nourinik    7 年前

    线 Company::class => CompanyPolicy::class, AuthServiceProvier 你必须把它取下来。

    我举个例子:

    假设我们有一个名为 SomeModel view 检查当前用户是否能够调用show方法。

    为守卫 api trait

    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.');
            }
        }
    }
    

    然后在控制器中使用它:

    class ExampleController extends Controller
    {
        use ApiTrait;
    
        public function show(SomeModel $something)
        {
            $this->authorize('view', $something);
    
            return 'it workes';
        }
    }
    

    注意,你应该用中间件保护你的路线 auth:api 否则调用 can 中的方法 ApiTrait