Laravel 政策无效

Laravel policy not working

在我的 Laravel 应用程序中,我有多项政策有效,但其中一项无效。

控制器

    public function store(Project $project, CreateActionRequest $request)
{
    $this->authorize('store',  $project);

    Action::create([
        'name' => $request->name,
    ]);

    return redirect()->route('projects.show', $project->id)->withSuccess('Massnahme erfolgreich gespeichert');
}

政策

namespace App\Policies\Project;
use App\Models\Project\Project;
use App\Models\User;
use App\Models\Project\Action;
use Illuminate\Auth\Access\HandlesAuthorization;
class ActionPolicy
{
use HandlesAuthorization;

public function store(User $user, Project $project)
{
    return $user->company_id === $project->company_id;
}
}

AuthServiceProvider

    protected $policies = [
    'App\Models\User' => 'App\Policies\CompanyAdmin\UserPolicy',
    'App\Models\Company' => 'App\Policies\CompanyAdmin\CompanyPolicy',
    'App\Models\Team' => 'App\Policies\CompanyAdmin\TeamPolicy',
    'App\Models\Department' => 'App\Policies\CompanyAdmin\DepartmentPolicy',
    'App\Models\Location' => 'App\Policies\CompanyAdmin\LocationPolicy',
    'App\Models\Division' => 'App\Policies\CompanyAdmin\DivisionPolicy',
    'App\Models\Costcenter' => 'App\Policies\CompanyAdmin\CostcenterPolicy',
    'App\Models\Workplace' => 'App\Policies\CompanyAdmin\WorkplacePolicy',
    'App\Models\Product' => 'App\Policies\CompanyAdmin\ProductPolicy',
    'App\Models\Project\Action' => 'App\Policies\Project\ActionPolicy',
    'App\Models\Project\Project' => 'App\Policies\Project\ProjectPolicy',
];

创建动作请求

namespace App\Http\Requests\Project;

use Illuminate\Foundation\Http\FormRequest;

class CreateActionRequest extends FormRequest
{

public function authorize()
{
    return true;
}


public function rules()
{
    return [
        'name' => 'required|min:3',
    ];
}
}

除 ActionPolicy 和 ProjectPolicy 外,所有策略均有效。 我在策略中添加了一个 __construct() 方法来检查策略是否被调用。但是 ActionPolicy 和 ProjectPolicy 不起作用。 我如何搜索错误?我尝试使用 dd() 但我只收到消息:此操作未经授权

由于您注入的是 CreateActionRequest 而不是 Request,这意味着您正在定义自己的一组规则来授权方法中的 FormRequest。此外,这意味着您必须定义一些规则,“FormRequest”必须通过这些规则才能到达您的控制器,这是一个很好的概念,我喜欢 Laravel,因为代码不是集中式的,而是传播,每一层都有自己的责任。现在,您不必从 CreateActionRequest 调用任何方法,也不必在控制器中编写有关 class 的任何代码,因为 Laravel 运行 authorize 方法default 在允许 Request 到达您的控制器之前,在您的 CreateActionRequest 中的 运行 authorize 方法之前,它运行 rules 方法来验证所有给定的字段传递您分配给它们的表达式,因此执行过程类似于 CreateActionRequest => rules => authorize => IF(authorized) Controller ELSE Not authorized,希望这是有道理的。为了修复您的代码:

1.) 删除 $this->authorize('store', $project);

这将允许您通过 not authorized 错误,以防您的 name 通过 CreateActionRequest 内的 rules 方法内的真值测试。如果您想使用您的 Action Policy,您需要将您的自定义 Request(CreateActionRequest) 与其连接起来,方法如下:

public function authorize()
{
    $store = $this->route('project');
    //The above line will return Project object if your mapping is correct
    //If it's not it will return the value you passed to your route for {project}
    return $this->user() && $this->user()->can('store', $store);
}

编辑:

Here is the link 在这里您可以看到如何正确授权和连接策略 CreateActionRequest

您最后是否使用 Request 对象定义了所有控制器方法?

public function store(Project $project, CreateActionRequest $request)

Request 对象应该是方法签名中的第一个参数:

public function store(CreateActionRequest $request, Project $project)

Dependency Injection & Route Parameters

If your controller method is also expecting input from a route parameter you should list your route parameters after your other dependencies.

大多数 Laravel 授权机制具有相同的方法签名,允许它们在不同的 类.

中工作