我需要在论坛上授权用户。
所以在刀片中,我在显示表单以回复主题之前有@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
答案 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)
没有模型的方法:
某些策略方法仅接收当前经过身份验证的用户,而不接收他们授权的模型的实例。授权创建操作时,这种情况最常见。例如,如果您要创建博客,则可能希望检查用户是否完全有权创建任何帖子。
在定义不接收模型实例的策略方法(例如创建方法)时,它将不接收模型实例。相反,您应该将方法定义为仅期望通过身份验证的用户: