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 授权机制具有相同的方法签名,允许它们在不同的 类.
中工作
在我的 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 授权机制具有相同的方法签名,允许它们在不同的 类.
中工作