ephort/laravel-data-authorization

为您的数据添加授权

v1.0.0 2024-06-04 08:08 UTC

This package is auto-updated.

Last update: 2024-09-08 13:57:51 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

此包为您的 spatie/laravel-data 对象添加授权,如果您想要将数据对象暴露给前端(例如在使用 Inertia 时),但仍然需要检查用户是否有权执行某些操作,这将非常有用。

安装

使用 composer 安装此包

composer require ephort/laravel-data-authorization

用法

此包旨在与 Inertia 一起使用,但不需要它或依赖于它。

要将授权检查添加到您的数据对象中,扩展 DataWithAuthorization 类。
所有基 Data 类的方法仍然可用。

接下来,实现静态 getAuthorizations 方法,该方法应返回一个包含需要暴露和检查的操作名称的数组。

use Ephort\LaravelDataAuthorization\DataWithAuthorization;

class UserData extends DataWithAuthorization
{
    public function __construct(
        public int $id,
        public string $name,
    ) {
    }
    
    public static function getAuthorizations(): array
    {
        return [
            'view',
            'update',
            'delete',
        ];
    }
}

当数据对象被转换时,会追加一个惰性的 authorization 属性到结果数组中。

该属性包含每个定义的策略操作的键,并由 Gate::allows 进行评估。

{
    "id": 1,
    "name": "Taylor Otwell",
    "authorization": {
        "view": true,
        "update": false,
        "delete": false
    }
}

避免处理授权

由于 authorization 属性是惰性的,我们可以将其排除在数据对象之外,以避免在每次序列化时调用 gate。

UserData::from($user)->exclude('authorization');

或使用内置的辅助方法

UserData::from($user)->withoutAuthorization();

注意使用自定义 from 方法时

当使用 自定义 from 方法 时,解析授权的管道不会被使用。

这意味着您必须在实例化您的数据对象时手动调用静态 resolveAuthorizationArray 方法

public static function fromModel(User $user): self
{
    return self::from([
        'id' => $user->id,
        'name' => $user->name,
        'authorization' => static::resolveAuthorizationArray($user),
    ]);
}

如果需要,您还可以将 authorization 数组包裹在一个惰性属性中

Lazy::create(fn () => static::resolveAuthorizationArray($user))->defaultIncluded();

TypeScript 支持

感谢 Spatie,从数据对象和枚举生成 TypeScript 接口非常容易。
安装 TypeScript Transformer 包 并发布其配置文件

composer require spatie/laravel-typescript-transformer
php artisan vendor:publish --tag=typescript-transformer-config

打开 config/typescript-transformer.php 并添加以下收集器和转换器

Ephort\LaravelDataAuthorization\Collectors\DataAuthorizationTypeScriptCollector::class 必须是第一个收集器。

'collectors' => [
+   Ephort\LaravelDataAuthorization\Collectors\DataAuthorizationTypeScriptCollector::class,
    Spatie\TypeScriptTransformer\Collectors\DefaultCollector::class,
    Spatie\TypeScriptTransformer\Collectors\EnumCollector::class,
],
'transformers' => [
    Spatie\LaravelTypeScriptTransformer\Transformers\SpatieStateTransformer::class,
    Spatie\TypeScriptTransformer\Transformers\EnumTransformer::class,
    Spatie\TypeScriptTransformer\Transformers\SpatieEnumTransformer::class,
    Spatie\LaravelTypeScriptTransformer\Transformers\DtoTransformer::class,
+   Ephort\LaravelDataAuthorization\Transformers\DataAuthorizationTypeScriptTransformer::class,
],

上述配置使用此包提供的收集器,该收集器查找扩展 DataWithAuthorization 的数据对象并生成包含其授权的类型定义。这就是支持类型授权的原理。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

致谢

代码主要来自由 Hybridly 提供的非常棒的项目 Hybridly,这是一个 Inertia 的优秀替代品。

许可协议

MIT 许可协议(MIT)。有关更多信息,请参阅许可文件