orottier / authorization-required
为Laravel框架提供的简单高效的授权管理器
Requires
- php: >=5.3.0
Requires (Dev)
- laravel/laravel: 5.1.*
- orchestra/testbench: ^3.1
- phpunit/phpunit: ^5.1
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
特性,并且应该为create
、update
和delete
操作定义授权策略。
以下方法放置在您的模型上
public static function authorizationReadScope(\Illuminate\Database\Eloquent\Builder $query);
使用此查询作用域来限制您的模型的读取访问。与授权策略一起,定义了模型读取、更新、创建和删除的规则。
读取行为
调用Model::find
将简单地返回null,如果规则阻止对象被看到(就像它不存在一样)。在这种情况下,您的应用程序可能配置为返回404状态码。
写入行为(更新、创建、删除)
如果策略规则禁止写入模型,将抛出AuthorizationRequired\PermissionException
。具体来说:UpdatePermissionException
、CreatePermissionException
和DeletePermissionException
。您的应用程序可以使用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) }
这就完了!