没有模型的授权策略

时间:2015-11-06 22:40:22

标签: laravel authentication laravel-5.1

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

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

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

但是,由于我没有传递Post

的实例,因此甚至无法调用

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

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

3 个答案:

答案 0 :(得分:5)

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

尝试使用@can('删除',Post :: class)并查看是否可以帮助您

参考 照亮\验证\存取\门:: firstArgumentCorrespondsToPolicy

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

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

答案 1 :(得分:1)

在控制器中

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

在Blade视图中

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

在Eloquent模型中

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

答案 2 :(得分:1)

没有模型的方法:

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

在定义不接收模型实例的策略方法(例如创建方法)时,它将不接收模型实例。相反,您应该将方法定义为仅期望通过身份验证的用户:

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