tanerkay/laravel-model-acl

基于个体记录/模型的访问控制

v0.3-beta 2023-07-02 08:09 UTC

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

许可证

MIT许可证(MIT)