美文网首页
Laravel 授权Gate使用操作

Laravel 授权Gate使用操作

作者: 空气KQ | 来源:发表于2019-10-12 19:46 被阅读0次

    简介

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

    其他地方调用

    • 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
    

    相关文章

      网友评论

          本文标题:Laravel 授权Gate使用操作

          本文链接:https://www.haomeiwen.com/subject/kercmctx.html