Laravel 授权Gate使用操作

2019-10-12  本文已影响0人  空气KQ

简介

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',
]);

授权方法: allowsdenies

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)
{
    //
}

其他地方调用

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);
@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
上一篇下一篇

猜你喜欢

热点阅读