orottier/authorization-required

为Laravel框架提供的简单高效的授权管理器

2.0.3 2016-12-01 07:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:09:38 UTC


README

为Laravel框架提供的简单高效的授权包

本包能做什么和不能做什么

此包使用可用的Eloquent钩子来强制执行对您的模型读写规则。不多也不少。

保护

  • 读取访问和创建新模型
  • 模型的更新和删除,在模型本身上触发

不保护

  • 原始查询:DB::table('users')->delete()
  • 批量更新和删除:User::where('role', 'admin')->delete()

请注意以下基本区别

✅ User::find(12)->delete(); // Invokes delete on the User Model
❌ User::where('id', 12)->delete() // Invokes delete on the Eloquent Builder
❌ DB::table('users')->where('id', 12)->delete() // Invokes delete on the Query Builder
❌ DB::delete("DELETE FROM `users` WHERE `id` = 12") // Executes a raw query

本包只会保护第一类删除/更新的guard。后三种无论如何规则都会通过。

通过Composer安装

注意:此包只能与Laravel框架一起使用。

使用composer在您的项目中使用AuthorizationRequired

composer require orottier/authorization-required
# (use version `1.*` for Laravel `5.2` and lower)
# (use version `2.*` for Laravel `5.3` and above)

工作原理

您想保护的Laravel模型应包含AuthorizationRequired特性,并且应该为createupdatedelete操作定义授权策略。

以下方法放置在您的模型上

public static function authorizationReadScope(\Illuminate\Database\Eloquent\Builder $query);

使用此查询作用域来限制您的模型的读取访问。与授权策略一起,定义了模型读取更新创建删除的规则。

读取行为

调用Model::find将简单地返回null,如果规则阻止对象被看到(就像它不存在一样)。在这种情况下,您的应用程序可能配置为返回404状态码。

写入行为(更新、创建、删除)

如果策略规则禁止写入模型,将抛出AuthorizationRequired\PermissionException。具体来说:UpdatePermissionExceptionCreatePermissionExceptionDeletePermissionException。您的应用程序可以使用App\Exception中的render函数将其转换为漂亮的403页面。

请注意,根据Laravel的默认设置,缺少规则将不允许任何操作。并且,任何策略都必须有已登录的用户才能接受。

示例用法

为了说明此包的用法,我们将在一个简单的应用程序上设置授权规则,该应用程序允许用户发布和修改博客条目(称为Post)。

要将授权规则应用于Eloquent模型,请包含AuthorizationRequired特性

<?php

// ...

use AuthorizationRequired\AuthorizationRequired;

class Post extends Model
{
    use AuthorizationRequired;

    // ...

}

默认情况下,对帖子的所有读取和写入访问都被拒绝。您的应用程序看起来会很空。我们应该允许用户查看可见和发布的帖子。当然,用户应该能够查看、编辑和删除他自己的所有帖子,即使是隐藏的帖子。

允许读取

读取访问规则以查询作用域的形式编写。通过定义函数authorizationReadScope,我们将覆盖默认的“拒绝所有”行为

<?php

// ...

use AuthorizationRequired\AuthorizationRequired;
use Illuminate\Database\Eloquent\Builder;

class Post extends Model
{
    use AuthorizationRequired;

    public static function authorizationReadScope(Builder $query)
    {
        if (Auth::check() && Auth::user()->isSuperAdmin()) {
            return $query;
        }
        $userId = Auth::check() ? Auth::user()->id : null;
        return $query->where('published_at', '<=', date('Y-m-d H:i:s'))
            ->where('hidden', false)
            ->orWhere('user_id', $userId);
    }

    // ...

}

如果您想不对读取访问施加任何限制,只需传递未更改的查询即可

public static function authorizationReadScope(Builder $query)
{
    return $query;
}

允许编辑

更新/创建/删除规则应定义为授权策略

<?php

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    public function update(User $user, Post $post)
    {
        return Auth::check()
            && ($post->user_id === $user->id || $user->isSuperAdmin());
    }

所有用户都可以创建帖子

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

我们将设置删除帖子的规则与编辑帖子的规则相同

public function delete(User $user, Post $post)
{
    return $this->update($user, $post)
}

这就完了!