php Laravel策略传递给UserPolicy的参数太少

pkln4tw6  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(145)

我有一个Laravel 9项目被用作API。我使用Laravel Spatie Permissions包来执行权限和角色检查。我设置了一个名为UserPolicy的Laravel策略,到目前为止,除了尝试授权show函数时,我的策略方法工作正常。
我的API只传递模型的ID,这很好,而且,我已经有了我的用户。我正在检查登录的用户是否能够在这里的平台上查看另一个可能不是他们自己的用户。
错误:
函数App\Policies\UserManagement\UserPolicy::view()的参数太少,在第798行的/Users/ryanholton/Sites/lespro-api/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate. php中传入了1个参数,而实际上需要2个参数
下面是我的控制器操作:

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    $this->authorize('view', User::class);

    $user = User::with('roles')->find($id);

    if (!$user) {
        return response()->json([
            'message' => 'User not found or invalid user ID'
        ], 404);
    }

    return response()->json([
        'user' => $user
    ], 200);
}

我的政策是:

<?php

namespace App\Policies\UserManagement;

use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class UserPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view any models.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function viewAny(User $user)
    {
        if ($user->can('user_index')) {
            return true;
        }
    }

    /**
     * Determine whether the user can view the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\User  $model
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function view(User $user, User $model)
    {
        if ($user->can('user_show')) {
            return true;
        }
    }

    /**
     * Determine whether the user can create models.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function create(User $user)
    {
        if ($user->can('user_store')) {
            return true;
        }
    }

    /**
     * Determine whether the user can update the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\User  $model
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function update(User $user, User $model)
    {
        if ($user->can('user_update')) {
            return true;
        }
    }

    /**
     * Determine whether the user can delete the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\User  $model
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function delete(User $user, User $model)
    {
        if ($user->can('user_destroy')) {
            return true;
        }
    }
}
wgxvkvu9

wgxvkvu91#

对于authorize方法,必须传递$user示例

$user = User::with('roles')->find($id);

 $this->authorize('view',$user);

并在策略中删除额外的用户参数

public function view(User $user)
    {
        if ($user->can('user_show')) {
            return true;
        }
    }
1wnzp6jl

1wnzp6jl2#

错误显示只传递了一个参数,而现有的方法需要两个参数,可能您根本不知道调用了哪个方法--它是UserPolicy类的***view***方法。
如果我们注意一下,我们确实会看到这个方法需要两个参数。

public function view(User $user, User $model)

尝试删除最后一个选项-这应该会有帮助。您的方法将看起来:

public function view(User $user)

相关问题