Laravel Policy 使用
Laravel 提供更简单的方式来处理用户授权动作。类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用。
文档 上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。
例子:我这里准备用编辑文章授权来做演示,在这个权限中,只有文章所有者可以编辑,来体验一下 Policy
如何实现它。
准备工作
安装 laravel
composer create-project --prefer-dist laravel/laravel laravel-vue "5.5.*"
建表
php artisan make:migration posts --create=posts Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string("title", 200); $table->text("content"); $table->timestamps(); $table->index('user_id'); });
创建 Model
php artisan make:model PostModel # app/PostModel.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class PostModel extends Model { protected $table = 'posts'; protected $fillable = ['title', 'content', 'user_id']; }
生成策略
策略其实就是授权方案所对应的类文件,它在 app/Policies
目录下面,下面我用命令创建一个策略文件。
php artisan make:policy PostPolicy
命令执行完毕之后,会生成 app/Policies/PostPolicy.php
文件,下面我们开始编辑它。
# app/Policies/PostPolicy.php namespace App\Policies; use App\User; use App\PostModel; use Illuminate\Auth\Access\HandlesAuthorization; class TopicPolicy { use HandlesAuthorization; public function create(User $user) { // code } public function update(User $user, PostModel $postModel) { return $user->id === $postModel->user_id; } public function delete(User $user, PostModel $postModel) { // code } }
注册策略
授权策略需要注册才能使用,在什么地方注册呢?laravel5.5
在 AuthServiceProvider
中包含一个 policies
的属性,这里面注册策略,下面我们看下如何注册。
# app/Providers/AuthServiceProvider.php namespace App\Providers; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; user App\PostModel; use App\Policies\PostPolicy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ PostModel::class => PostPolicy::class, // 注意在这里注册 policy ]; public function boot() { $this->registerPolicies(); } }
使用策略
注册完毕之后,在 User
模型中有 can
和 cant
方法来使用策略,如在 PostController
编辑时使用:
# app/Http/Controllers/PostController.php public function create() { if (Auth::user()->can('create', PostModel)) { // 注意这里的用法 // 可以创建 } else { // 无权限 } } public function update(Request $request) { $id = $request->input('id'); $post = PostModel::findOrFail($id); if (Auth::user()->can('update', $post)) { // 可以编辑 } else { // 无编辑权限 } }
如果你想超级管理员也拥有编辑权限的话,可以在定义策略的时候加上策略过滤器,也就是一个 before
方法:
# app/Policies/PostPolicy.php public function before($user, $ability) { if ($user->isSuperAdmin()) { return true; } } # app/User.php public function isSuperAdmin() { // 定义ID为1为超级管理员 if ($this->id == 1) { return true; } return false; }
在 balde
模板中使用 @can
和 @cannot
方法来判断
@can('create', App\PostModel::class) <a href="">创建</a> @endcan @can("update", $post) <a href="">编辑</a> @endcan
好了,这次就写到这里,希望此篇笔记能帮助到你。
原文地址相关推荐
86417413 2020-11-25
83206733 2020-11-19
86276537 2020-11-19
83266337 2020-11-19
86256434 2020-11-17
zhouboxiao 2020-11-16
rise 2020-11-22
sssdssxss 2020-11-20
windle 2020-11-10
孙雪峰 2020-10-30
85477104 2020-11-17
xfcyhades 2020-11-20
liuxudong00 2020-11-19
cheidou 2020-11-19
gunhunti 2020-09-25
csdnYF 2020-11-15
达观数据 2020-11-11
playlinuxxx 2020-11-11