ephort / laravel-data-authorization
为您的数据添加授权
Requires
- php: ^8.3
- illuminate/contracts: ^10.0||^11.0
- spatie/laravel-data: ^4.6
- spatie/laravel-package-tools: ^1.16
- spatie/laravel-typescript-transformer: ^2.4
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^9.0.0||^8.22.0
- pestphp/pest: ^2.34
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-laravel: ^2.3
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- spatie/laravel-ray: ^1.35
README
此包为您的 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)。有关更多信息,请参阅许可文件。