amethyst/permission

v0.3.1 2024-04-05 11:00 UTC

README

Action Status

Amethyst 包。

通过针对您的数据和路由进行广泛的定制来定义权限。

要求

PHP 7.2 及以上。

待办事项

  • 属性授权

安装

您可以通过输入以下命令通过 Composer 安装它

composer require amethyst/permission

该包将自动注册自身。

用法

简单用法如下

use Amethyst\Models\Permission;
use Symfony\Component\Yaml\Yaml;

Permission::create([
	'effect' => 'accept',
	'type' => 'data',
	'payload' => Yaml::dump([
		'action' => 'create',
		'data' => 'foo'
	]),
	'agent' => '{{ agent.id }} == 1',
]);

每当为 Permission 模型触发 eloquent.saved 事件时,权限将自动重新加载。

效果

效果可以是 acceptdeny。如果没有任何权限,任何用户都无法执行任何操作。如果您添加了权限接受和拒绝,则两个权限都将应用。

例如,您可以设置“用户可以看到所有评论”和“用户不能看到此评论”。最终,用户可以看到除了您定义的评论之外的所有评论。

类型

您的权限类型指示将用于解决您请求的类。

它可以是 dataroute,但您可以在 amethyst.permissions.permission 中扩展它

代理

代理通过 facade Illuminate\Support\Facades\Auth 和方法 user() 获取。

当此字段为空时,表示它应用于所有代理。

代理必须返回条件为真或假。

如果您想查看语法,请参阅 nicoSWD/php-rule-parser

在逻辑解析器解析之前,将先进行 twig 解析器。传递的唯一变量是代理,它是您的 App\Models\User。然后您可以使用任何逻辑来获取所需的信息。例如,您可以根据任何属性和任何关系(例如组)进行过滤:{{ agent.groups.contains('myGroupName') ? 1 : 0 }} === 1

有效负载

一个 YAML 格式的有效负载,用于定义您的权限规范。例如,对于 route 权限,它可以是 URL 的通配符。

有效负载 - 路由

  • name: 您希望使用的路由名称,您可以使用通配符 *
  • url: 路由的 URL,与之前一样,您可以使用通配符 *
  • method: 路由方法

一些示例

为每个用户启用端点 /profile

use Amethyst\Models\Permission;
use Symfony\Component\Yaml\Yaml;

Permission::create([
	'type' => 'route',
	'payload' => Yaml::dump([
		'url' => '/profile'
	])
]);

您也可以使用数组

use Amethyst\Models\Permission;
use Symfony\Component\Yaml\Yaml;

Permission::create([
	'type' => 'route',
	'payload' => Yaml::dump([
		'url' => [
			'/profile',
			'/recovery-password'
		],
		'method' => [
			'POST',
			'GET'
		]
	])
]);

为用户 ID 2 启用端点 foo.*(foo.index, foo.create, foo.show, foo.update, foo.delete)

use Amethyst\Models\Permission;
use Symfony\Component\Yaml\Yaml;

Permission::create([
	'type' => 'route',
	'payload' => Yaml::dump([
		'url' => 'foo.*'
	]),
	'agent' => '{{ agent.id }} === 2'
]);

有效负载 - 数据

以下示例将允许用户#2 只查看名为 post 且名称包含 foo 的数据

use Amethyst\Models\Permission;
use Symfony\Component\Yaml\Yaml;

Permission::create([
	'type' => 'data',
	'payload' => Yaml::dump([
		'name' => [
			'post'
		],
		'action' => [
			'query',
		],
		'filter' => [
			'name ct "foo"'
		]
	]),
	'agent' => '{{ agent.id }} === 2'
]);

所有操作的列表:query, create, update, remove