视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Laravel中policy完成用户授权方法实例
2020-11-27 20:01:10 责编:小采
文档

Laravel 提供了一种更简单的方式来处理用户授权动作。类似用户认证,Laravel 有 2 种主要方式来实现用户授权:gates 和策略(policy)。这里记录一下Policy的用法,使用Policy完成用户授权主要包含三个步骤:

定义策略类
注册策略类和模型关联
策略判断

定义策略类

策略是在特定模型或者资源中组织授权逻辑的类。例如,如果应用是一个博客,会有一个 Post 模型和一个相应的 PostPolicy 来授权用户动作,比如创建或者更新博客或者删除博客。

此时可以使用artisan 命令创建策略类,以下的命令创建了一个空的Post的策略类

php artisan make:policy PostPolicy

生成的策略将放置在 app/Policies 目录。如果在你的应用中不存在这个目录,那么 Laravel 会自动创建

如果想要生成一个包含CURD的策略类,可以使用以下artisan命令

php artisan make:policy PostPolicy --model=Post

注册策略类和模型关联

在AuthServiceProvider中注册策略类

 protected $policies = [ //'App\Model' => 'App\Policies\ModelPolicy', 这个是laravel中默认注册了的policy,可以模仿这个注册我们自己的policy 'App\Post' => 'App\Policies\PostPolicy', //注册Post的policy
 ];

策略类和模型关联即是在policy中编写我们的策略方法

<?phpnamespace App\Policies;use App\User;use App\Post;use Illuminate\Auth\Access\HandlesAuthorization;class PostPolicy{
 use HandlesAuthorization; /**
 * Determine whether the user can update the post.
 *
 * @param \App\User $user
 * @param \App\Post $post
 * @return mixed
 */
 public function update(User $user, Post $post)
 {
 //
 return $user->id === $post->user_id;
 } /**
 * Determine whether the user can delete the post.
 *
 * @param \App\User $user
 * @param \App\Post $post
 * @return mixed
 */
 public function delete(User $user, Post $post)
 {
 //
 return $user->id === $post->user_id;
 }

update 方法接受 User 和 Post 实例作为参数,并且应当返回 true 或 false 来指明用户是否授权更新给定的 Post。因此,这个例子中,我们判断用户的 id 是否和 post 中的 user_id 匹配,

策略判断

这里我们在控制器里面使用控制器辅助函数来进行策略判断

//文章编辑逻辑
 public function update(Post $post)
 {
 $this->validate(request(),[ 'title' => 'required|String|min:5|max:50', 'content' => 'required|String|min:10',
 ]);
 $this->authorize('update',$post); ////////////////////策略判断
 $post->title = request('title');
 $post->content = request('content');
 $post->save(); return redirect("/posts/{$post->id}");
 } //文章删除
 public function delete(Post $post)
 { //TODO::权限验证
 $this->authorize('delete',$post); //////////////////策略判断
 $post->delete(); return redirect('/posts');
 }

只要验证不通过,laravel会自动抛出一个HttpException This action is unauthorized.

开发中,可能我们要根据用户的权限来判断是否显示一些按钮,比如视图中的编辑或者是修改的按钮,在blade中我们可以使用@can 来指定模型按钮是否显示

Laravel 提供了一种更简单的方式来处理用户授权动作。类似用户认证,Laravel 有 2 种主要方式来实现用户授权:gates 和策略(policy)。

这里记录一下Policy的用法,使用Policy完成用户授权主要包含三个步骤:

定义策略类
注册策略类和模型关联
策略判断

定义策略类

策略是在特定模型或者资源中组织授权逻辑的类。例如,如果应用是一个博客,会有一个 Post 模型和一个相应的 PostPolicy 来授权用户动作,比如创建或者更新博客或者删除博客。

此时可以使用artisan 命令创建策略类,以下的命令创建了一个空的Post的策略类

php artisan make:policy PostPolicy

生成的策略将放置在 app/Policies 目录。如果在你的应用中不存在这个目录,那么 Laravel 会自动创建

如果想要生成一个包含CURD的策略类,可以使用以下artisan命令

php artisan make:policy PostPolicy --model=Post

注册策略类和模型关联

在AuthServiceProvider中注册策略类

 protected $policies = [ //'App\Model' => 'App\Policies\ModelPolicy', 这个是laravel中默认注册了的policy,可以模仿这个注册我们自己的policy 'App\Post' => 'App\Policies\PostPolicy', //注册Post的policy
 ];

策略类和模型关联即是在policy中编写我们的策略方法

<?phpnamespace App\Policies;use App\User;use App\Post;use Illuminate\Auth\Access\HandlesAuthorization;class PostPolicy{
 use HandlesAuthorization; /**
 * Determine whether the user can update the post.
 *
 * @param \App\User $user
 * @param \App\Post $post
 * @return mixed
 */
 public function update(User $user, Post $post)
 {
 //
 return $user->id === $post->user_id;
 } /**
 * Determine whether the user can delete the post.
 *
 * @param \App\User $user
 * @param \App\Post $post
 * @return mixed
 */
 public function delete(User $user, Post $post)
 {
 //
 return $user->id === $post->user_id;
 }

update 方法接受 User 和 Post 实例作为参数,并且应当返回 true 或 false 来指明用户是否授权更新给定的 Post。因此,这个例子中,我们判断用户的 id 是否和 post 中的 user_id 匹配,

策略判断

这里我们在控制器里面使用控制器辅助函数来进行策略判断

//文章编辑逻辑
 public function update(Post $post)
 {
 $this->validate(request(),[ 'title' => 'required|String|min:5|max:50', 'content' => 'required|String|min:10',
 ]);
 $this->authorize('update',$post); ////////////////////策略判断
 $post->title = request('title');
 $post->content = request('content');
 $post->save(); return redirect("/posts/{$post->id}");
 } //文章删除
 public function delete(Post $post)
 { //TODO::权限验证
 $this->authorize('delete',$post); //////////////////策略判断
 $post->delete(); return redirect('/posts');
 }

只要验证不通过,laravel会自动抛出一个HttpException This action is unauthorized.

开发中,可能我们要根据用户的权限来判断是否显示一些按钮,比如视图中的编辑或者是修改的按钮,在blade中我们可以使用@can 来指定模型按钮是否显示。

下载本文
显示全文
专题