简介
Laravel 还提供了一个简单的方式来管理授权逻辑以便控制对资源的访问权限。和认证一样,在 Laravel 中实现授权很简单,主要有两种方式:Gate 和 Policy。
有必须要进行一次实践
Gate使用
定义
App\Providers\AuthServiceProvider 定义授权规则
//$user要求,User用户必须是认证登录的,自动注入
//$enid 自己传入的参数,如果多个参数,传入使用数组,则后续变量自动增加
Gate::define('update-post', function ($user, $enid) {
return $user->id == $enid;
});
多个参数
Gate::define('update-post', function ($user, $enid,$end2) {
return $user->id == $enid;
});
使用
$user = Auth::loginUsingId(1);
if (Gate::allows('update-post', [1, 3])) {
// 当前用户可以更新文章...
echo 'ok';
} else {
echo 'fail';
}
Gate资源定义
Gate::resource('posts', 'App\Policies\PostPolicy');
等同于
Gate::define('posts.view', 'App\Policies\PostPolicy@view');
Gate::define('posts.create', 'App\Policies\PostPolicy@create');
Gate::define('posts.update', 'App\Policies\PostPolicy@update');
Gate::define('posts.delete', 'App\Policies\PostPolicy@delete');
附加
Gate::resource('posts', 'PostPolicy', [
'image' => 'updateImage',
'photo' => 'updatePhoto',
]);
授权方法:
allows
或denies
if (Gate::allows('update-post', $post)) {
// 当前用户可以更新文章...
}
if (Gate::denies('update-post', $post)) {
// 当前用户不能更新文章...
}
指定用户授权操作 forUser($user)
if (Gate::forUser($user)->allows('update-post', $post)) {
// 当前用户可以更新文章...
}
if (Gate::forUser($user)->denies('update-post', $post)) {
// 当前用户不能更新文章...
}
拦截,类似中间件
before
方法 ,返回false
不再继续后续操作
Gate::before(function ($user, $ability) {
if ($user->isSuperAdmin()) {
return true;
}
});
创建 Policy
- 创建
php artisan make:policy PostPolicy
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class PostPolicy
{
use HandlesAuthorization;
/**
* Create a new policy instance.
*
* @return void
*/
public function __construct()
{
//
}
}
s启用,注册
App\Providers\AuthServiceProvider 还在这里面定义
protected $policies = [
Post::class => PostPolicy::class,
];
设置方法
/**
* 判断给定文章是否可以被用户更新.
*
* @param \App\User $user 自动注入
* @param \App\Post $post 传入参数
* @return bool
* @translator laravelacademy.org
*/
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
/**
* 判断当前用户是否可以创建文章.
*
* @param \App\User $user
* @return bool
*/
public function create(User $user)
{
//
}
其他地方调用
- User 模型
if ($user->can('update', $post)) {
//
}
if ($user->can('create', Post::class)) {
// Executes the "create" method on the relevant policy...
}
- 中间件
use App\Post;
Route::put('/post/{post}', function (Post $post) {
// The current user may update the post...
})->middleware('can:update,post');
Route::post('/post', function () {
// The current user may create posts...
})->middleware('can:create,App\Post');
- 控制器
$this->authorize('update', $post);
$this->authorize('create', Post::class);
- Blade 模板
@can('update', $post)
<!-- 当前用户可以更新文章 -->
@elsecan('create', App\Post::class)
<!-- 当前用户可以创建新文章 -->
@endcan
@cannot('update', $post)
<!-- 当前用户不能更新文章 -->
@elsecannot('create', App\Post::class)
<!-- 当前用户不能创建新文章 -->
@endcannot
@can('create', App\Post::class)
<!-- 当前用户可以创建文章 -->
@endcan
@cannot('create', App\Post::class)
<!-- 当前用户不能创建文章 -->
@endcannot
@if (Auth::user()->can('update', $post))
<!-- 当前用户可以更新文章 -->
@endif
@unless (Auth::user()->can('update', $post))
<!-- 当前用户不能更新文章 -->
@endunless
网友评论