欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Laravel 权限控制 Gate Policy

程序员文章站 2022-03-07 20:53:15
...
这篇文章主要介绍了关于Laravel 权限控制 Gate Policy,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

关于权限

本质 针对一段可执行的逻辑单元描述是否开启生产的判断。

定义 必定有一用户实例或唯一标识参数,以及与之关联的使用资源。通常使用闭包或函数或方法

使用 调用权限逻辑单元句柄,参数 权限操作对象,用户信息。

源起

最基本的权限控制,三元运算符 ?:。很显然条件判断,后面跳到相应的执行逻辑。

laravel的思路是将执行逻辑(生产代码),授权(条件判断逻辑)进行分离。重点关注条件的产生,通俗讲强化授权逻辑(这对复杂的授权十分有用)。公设:所有的代码在服务注册完毕后,启动。所以下面这段代码会被注册。其目的是找到真正授权判断的逻辑体。

Gate::define('update articles', 'ArticlePolicy@update')

其中第一个参数显然只是一个授权标识符(用来调用的句柄参数),第二个参数才为授权的逻辑执行体。

laravel授权定义

AuthServiceProviderboot 方法里定义授权

Gate::define('update articles', function ($user, $article) {
    return $user->id == $article->user_id;
});

Gate::define('update articles', 'ArticlePolicy@edit');
<?php

namespace App\Policies;

use App\User;
use App\Models\Article;

class ArticlePolicy
{
    public function update(User $user, Article $article)
    {
        return $user->id == $article->author_id;
    }
}

laravel授权使用

  1. Gate 门面:Gate::allows('update articles', $article)Gate::denies('update articles', $article)

  2. Controller 引入了

    trait AuthorizesRequests

    $this->authorize('update articles', $article)

  3. Blade 模板:@can('update articles', $article)@cannot('update articles', $article) 指令。

  4. User Model 实例:$user->can('update articles', $article)$user->cannot('update articles', $article)

Laravel Policy

为了方便地定义和使用授权,Laravel 在Gate的基础上引入了 Policy。policy内部的每一个方法,都会被用gate::define方法的描述注册。所以这就是为什么使用了策略类注册之后,即便没有用Gate门面定义授权逻辑,在控制器内仍然可以使用Gate::allow('策略类方法')的形式来进行授权判断 。

AuthServiceProviderpolicies 数组属性里先定义授权映射关系

/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    Article::class => ArticlePolicy::class,
];
<?php

namespace App\Policies;

use App\User;
use App\Models\Article;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    public function create(User $user)
    {
        return true;
    }

    public function delete(User $user, Article $article)
    {
        return $user->id == $article->author_id;
    }

     public function before($user, $ability)
    {
        if($user->isSuperAdmin()){
            return true;
        }
    }
 }

注意

Policy 只是在普通 PHP 类基础上添加了一个 HandlesAuthorization trait。

在 Policy 中会在所有方法执行前调用,经常用到的地方就是处理管理员授权逻辑。

相关推荐:

Laravel利用gulp如何构建前端资源

以上就是Laravel 权限控制 Gate Policy的详细内容,更多请关注其它相关文章!