【问题标题】:Authorization Policy without model没有模型的授权策略
【发布时间】:2016-02-08 04:39:13
【问题描述】:

我需要在论坛上授权用户。 所以在刀片中,我有@can('editPost', $post) 在显示回复主题的表单之前。我的 PostPolicy 类有一个 editPost 方法,如果它是用户自己的帖子,则验证为 true。

但是,当我想做一个简单的检查时会出现问题,例如deletePost()。这会检查Auth::user()->isAdmin

public function deletePost(User $user) {
    return Auth::user()->isAdmin;
    // return $user->isAdmin
}

但是,这甚至不会被调用,因为我没有传递 Post 的实例

我的实际应用程序要复杂得多,但我使用isAdmin 作为一个简单示例。

我想在 AuthServiceProvider 中定义 $gate->define('deletePost', 'App\Policies\PostPolicy@deletePost'); 可能会起作用,但最终会分离我的定义和方法,最终导致大型应用程序混乱 AuthServiceProvider

【问题讨论】:

标签: laravel authentication laravel-5.1


【解决方案1】:

没有模型的方法:

某些策略方法只接收当前经过身份验证的用户,而不是它们授权的模型实例。这种情况在授权创建操作时最常见。例如,如果您正在创建博客,您可能希望检查用户是否有权创建任何帖子。

当定义不接收模型实例的策略方法时,例如创建方法,它不会接收模型实例。相反,您应该将该方法定义为只需要经过身份验证的用户:

https://laravel.com/docs/7.x/authorization

【讨论】:

    【解决方案2】:

    在控制器中

    $this->authorize('<ability>', <Class-With-Rule::class> | <Full-Path-To-Class>);
    

    在刀片视图中

    @can('<ability>', <Class-With-Rule>::class> | <Full-Path-To-Class>)
    

    在 Eloquent 模型中

    $user->can('<ability>', <Class-With-Rule>::class> | <Full-Path-To-Class>);
    

    【讨论】:

      【解决方案3】:

      当您注册一个策略时,它是用于将检查路由到类的类名,因此为了路由到该策略,您只需传递您注册它的类型的类名。

      尝试使用@can('delete', Post::class) 看看是否能到达那里

      参考 Illuminate\Auth\Access\Gate::firstArgumentCorrespondsToPolicy

      编辑 经过多一点挖掘后,我发现了这个 https://github.com/laravel/framework/commit/70f75255808ffc96275e6f2f356616dd2e163434#diff-961368895033e553787b301c3be0e17a

      所以看起来如果您使用的是 5.1.23 版本,那么您将能够传递一个字符串,否则您只需传递新的帖子

      【讨论】:

        猜你喜欢
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        相关资源
        最近更新 更多