Laravel 提供更简单的方式来处理用户授权动作。类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用。
文档 上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。
例子:我这里准备用编辑文章授权来做演示,在这个权限中,只有文章所有者可以编辑,来体验一下 Policy
如何实现它。
准备工作
安装 laravel1
composer create-project --prefer-dist laravel/laravel laravel-vue "5.5.*"
建表1
2
3
4
5
6
7
8
9php 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');
});
创建 Model1
2
3
4
5
6
7
8
9
10
11
12php 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
目录下面,下面我用命令创建一个策略文件。1
php artisan make:policy PostPolicy
命令执行完毕之后,会生成 app/Policies/PostPolicy.php
文件,下面我们开始编辑它。
1 | # app/Policies/PostPolicy.php |
注册策略
授权策略需要注册才能使用,在什么地方注册呢?laravel5.5
在 AuthServiceProvider
中包含一个 policies
的属性,这里面注册策略,下面我们看下如何注册。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 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
编辑时使用:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 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
方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 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
方法来判断1
2
3
4
5
6
7@can('create', App\PostModel::class)
<a href="">创建</a>
@endcan
@can("update", $post)
<a href="">编辑</a>
@endcan
好了,这次就写到这里,希望此篇笔记能帮助到你。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
Happly Coding