Laravel策略不授权操作

o0lyfsai  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(102)

在我的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(),但总是得到消息:
这是未经授权的

dgiusagp

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(验证请求)与它挂钩,这是如何:

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

字符串

编辑:

在此链接中,您可以了解如何正确授权策略并将其与CreateActionRequest连接

6kkfgxo0

6kkfgxo02#

你所有的控制器方法都是最后用Request对象定义的吗?

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

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

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

依赖注入和路线参数

如果你的控制器方法也需要来自路由参数的输入,你应该在其他依赖项之后列出路由参数。
大多数Laravel授权机制都有相同的方法签名,允许它们跨不同的类工作。

相关问题