【问题标题】:Can't get Laravel middleware "can:something" to work with my policy无法让 Laravel 中间件“can:something”与我的策略一起使用
【发布时间】:2021-06-16 00:57:07
【问题描述】:

我想确保当前用户能够编辑用户凭据,因此我制定了以下 UserPolicy:

class UserPolicy
{
    use HandlesAuthorization;

    public function update(User $user, User $model)
    {
        return true;
        //return $user->is($model);
    }
}

我什至在 AppServiceProvider 中注册了策略:

protected $policies = [
    User::class => UserPolicy::class
];

现在我尝试将以下中间件添加到 web.php 中的更新路由:“->middleware('can:update,user');”像这样:

Route::patch('/profiles/{user}',function (){
    dd('It works');
})->middleware('can:update,user');

但我不断收到以下错误:

找不到错误类“2”

其中 2 是我们尝试修补的用户 ID。如果我使用用户 ID 1 登录,那将是找不到的类。我不明白为什么。我按照 Laravel 网站 (https://laravel.com/docs/8.x/authorization#via-middleware) 上的文档进行操作。

我也尝试将 {user} 设置为 {user:id} -> 结果相同
我曾尝试在“can”上添加 id,如下所示:can:update,user:id -> Gives 403 not authorized

edit.blade.php 有以下内容:

    <form action="/profiles/{{ auth()->user()->id }}" method="POST">
        @csrf
        @method('PATCH')
        ...INPUTS...
    </form>

我当然试过运行:"php artisan optimize" 没有效果

我在这里缺少什么?怎么了?

编辑:

我现在用 Gate 尝试了同样的事情。我将以下内容放在 AppServiceProvider.php 中:

public function boot()
{
    Gate::define('edit-user', function(User $currentUser, User $user){
        return true;
        //return $currentUser->id === $user->id;
    });
}

以及 web.php 中的以下中间件:

Route::patch('/profiles/{user}',function (){
    dd('It works');
})->middleware('can:edit-user,user');

它给了我完全相同的错误:找不到第 2 类

我什至尝试像这样传递完整的模型路径:

Route::patch('/profiles/{user}',function (){
    dd('It works');
})->middleware('can:edit-user,App\Models\User');

它给了我以下错误:

参数 2 传递给 App\Providers\AppServiceProvider::App\Providers{closure}() 必须是 App\Models\User 的实例,给定的字符串,调用 /var/www/vhosts/domain.com/httpdocs/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php 在第 474 行

【问题讨论】:

    标签: php laravel laravel-8


    【解决方案1】:

    我认为这是由于未使用模型绑定,您正在传递 id ,它需要 user 模型。检查此版本是否有效。

    Route::patch('/profiles/{user}',function (User $user) {
        dd('It works');
    })->middleware('can:edit-user,user');
    

    【讨论】:

    • 谢谢,它有效。终于有道理了!
    • 今后最好避免将闭包作为路由,因为它们不能被缓存,这在更大的应用程序中是一个非常好的优化
    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2017-01-18
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多