tanerkay / laravel-model-acl
基于个体记录/模型的访问控制
v0.3-beta
2023-07-02 08:09 UTC
Requires
- php: ^8.0
- illuminate/config: ^8.0|^9.0|^10.0
- illuminate/database: ^8.0|^9.0|^10.0
- illuminate/support: ^8.0|^9.0|^10.0
- spatie/laravel-package-tools: ^1.11
Requires (Dev)
- ext-json: *
- orchestra/testbench: ^6.0|^7.0|^8.0
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-10-01 00:08:58 UTC
README
此包允许根据自定义授权规则进行记录级访问控制。
这处理了您可能在一个表中有很多记录,但每个实体都有自己的访问控制规则的情况。例如,您可能有一个文档表,这不仅仅是一个用户可以编辑自己的文档,并查看所有其他文档的简单场景。也许每个文档的访问都需要单独设置,例如,文档X可以由Bob和Jane编辑,并由员工组查看;而文档Y只能由财务团队查看。
以下是如何使用它的示例
use Illuminate\Database\Eloquent\Model; use Tanerkay\ModelAcl\Traits\ModelBasedAccessControl; class Report extends Model { use ModelBasedAccessControl; // ... } $post->can('view');
支持开发者
待添加...
文档
安装
需要PHP 8.0或更高版本,以及Laravel 8.x或更高版本(目前支持至9.x)
composer require tanerkay/laravel-model-acl
您可以使用以下命令发布迁移
php artisan vendor:publish --provider="Tanerkay\ModelAcl\ModelAclServiceProvider" --tag="model-acl-migrations"
php artisan migrate
您可以选择使用以下命令发布配置文件
php artisan vendor:publish --provider="Tanerkay\ModelAcl\ModelAclServiceProvider" --tag="model-acl-config"
将访问控制规则分配给单个模型
可以使用addAccessControl()方法将规则添加到单个模型。
public function addAccessControl( string|array $abilities, object|array $ruleDefinitions, ?string $description = null ): void
它接受
- 一个能力名称或可以用于
can()调用中能力名称的列表。 - 一个规则定义数组,每个规则定义是一个包含字符串
'class'和参数数组'arguments'的数组。 - 可选的规则描述,该描述可以与规则定义一起存储在数据库中。
例如,限制某个帖子只有版主和管理员可以访问。
$post->addAccessControl('view', [ [ 'class' => \Tanerkay\ModelAcl\Rules\HasRole::class, 'arguments' => ['admin', 'moderator'], ] ]); // throws exception if $user->hasRole(['admin', 'moderator']) doesn't return true $post->can('view');
HasRole类假设您的User模型有一个接受字符串或字符串数组的方法hasRole()。您可以使用env键MODEL_ACL_AUTHENTICATABLE_HAS_ROLE自定义该方法名称。
创建自定义规则
对于其他规则或逻辑,您可以构建自己的Rule类,该类实现\Tanerkay\ModelAcl\Contracts\RuleContract或扩展抽象类\Tanerkay\ModelAcl\Rules\Rule。
例如:
use Tanerkay\ModelAcl\Rules\Rule; class AgeRequirementRule extends Rule { public function authorize(?Authenticatable $user, ...$arguments): void { $user ??= $this->getUser(); if ($user->date_of_birth->diffInYears() < $arguments[0]) { throw new \Exception('Not wise enough'); } } }
$drink = Drink::where('is_alcoholic', true)->first(); $drink->addAccessControl('buy', [ [ 'class' => AgeRequirementRule::class, 'arguments' => 18, ] ]); // throws exception if user is under 18 years of age $drink->can('buy');
测试
composer test
感谢
- Spatie为制作出色的包,此包利用了
spatie/laravel-package-tools,并且本身源自spatie/laravel-activitylog。