在我的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',
];
}
}
型
所有的策略都在工作,除了XNUMX Policy和ProjectPolicy。我在策略中添加了一个__construct()
方法来检查策略是否被调用。但是XNUMX Policy和ProjectPolicy不工作。我如何搜索错误?我尝试使用dd()
,但总是得到消息:
这是未经授权的
2条答案
按热度按时间dgiusagp1#
由于你注入的是
CreateActionRequest
而不是Request
,这意味着你定义了自己的一套规则来授权你的方法内部的FormRequest
。进一步说,这意味着你必须定义一些规则,“FormRequest
“必须通过这些规则才能到达你的控制器,这是一个很好的概念,我喜欢Laravel,因为代码不是集中的,现在,你不需要从CreateActionRequest
调用任何方法,也不需要在控制器中编写任何关于该类的代码,因为Laravel在允许Request
到达控制器之前会通过default
运行authorize
方法,在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
连接6kkfgxo02#
你所有的控制器方法都是最后用
Request
对象定义的吗?字符串
Request
对象应该是方法签名中的第一个参数:型
依赖注入和路线参数
如果你的控制器方法也需要来自路由参数的输入,你应该在其他依赖项之后列出路由参数。
大多数Laravel授权机制都有相同的方法签名,允许它们跨不同的类工作。