关于 policy 验证问题

我定义了一个ProjectPolicy

 /**
 * Determine whether the user can create projects.
 *
 * @param  \App\Models\User $user
 * @return mixed
 */
public function create(User $user) {
    //
    return in_array($user->type, User::MANAGE_TYPE);
}

在controller 中使用

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create() {
     $this->authorize('create', Auth::user());
}

然后一直提示

This action is unauthorized.

修改为一下就可以了

    public function create() {
    if (Auth::user()->can('create', Project::class)) {
        return view('projects.create');
    }
}

为啥create不能如 $this->authorize调用,而store中就可以?

    public function store(ProjectRequest $request, Project $project, ImageUploadHandler $uploader) {
        $this->authorize('create', $project);
        $data = $request->all();
    if ($request->img) {
        $result = $uploader->save($request->img, 'project', 'project_');
        if ($result) {
            $data['img'] = $result['path'];
        }
    }
    Project::create($data);
    return redirect()->route('project.index')->with('success', '创建成功!');
}
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

我明白了,这是一个不指定model的验证,$this->authorize('create', Auth::user()) 第二个参数不是create验证里的user,
user对象laravel会自动获取,我们需要指定的是authorize验证的哪一个model,所以修改为$this->authorize('create', Project::class)就可以了

5年前 评论
讨论数量: 3


** public function create(User $user) { **
改成
** public function create() { **
`
试试

5年前 评论

@surest 试过了,不行

5年前 评论

我明白了,这是一个不指定model的验证,$this->authorize('create', Auth::user()) 第二个参数不是create验证里的user,
user对象laravel会自动获取,我们需要指定的是authorize验证的哪一个model,所以修改为$this->authorize('create', Project::class)就可以了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!