scaleplan / access
Scaleplan 访问控制系统
Requires
This package is auto-updated.
Last update: 2024-09-16 19:56:48 UTC
README
访问控制系统 + 参数类型检查。
安装
composer require scaleplan/access
初始化
cd vendor/scaleplan/access
./init schema data
其中 schema 和 data 是可选参数,表示需要在数据库中生成访问模式并在配置文件中分别以 URL、文件和输入的形式指定。
工作原理
控制器方法是从控制器类外部调用的。如何发生这件事并不重要。
如果方法是公开的,或者方法中的注释指示了配置中 access_no_rights_check 指令的值,则系统不参与,执行按常规进行。如果方法是私有的(访问修饰符为 private 和 protected),并且如果指定了特殊的 phpdoc 标记处理访问方法系统(值为配置中的 access_label 指令),则数据库查询将检查使用特定设置执行该方法的可能(在创建访问对象时指定用户 ID)。
例如
class User
{
/**
* Get user object
*
* @accessMethod
*
* @param int $id - user identifier
*
* @return UserAbstract
*/
protected static function get(int $id): UserAbstract
{
//...
}
}
此示例将检查当前用户对 User 类的静态 get 方法的访问权限,对于 $id 参数的任何值。
但是,可以定义执行具有特定参数的方法的访问权限
/**
* Get user object
*
* @accessMethod
*
* @accessFilter id
*
* @param int $id - user identifier
*
* @return UserAbstract
*/
protected static function actionGet(int $id): UserAbstract
{
//...
}
在此示例中,只有在数据库中存储的允许值列表(表 access_right 的 values 列)中包含 $id 过滤参数的值时,才允许访问。数据库中的列表如下所示
ARRAY ['<filter value 1>, <filter value 2',...]
您还可以根据多个参数进行筛选
/**
* Set user role
*
* @accessMethod
*
* @accessFilter id, role
*
* @param int $id - user identifier
* @param string $role - user role
*
* @return void
*/
protected static function actionSetRole(int $id, string $role): void
{
//...
}
在这种情况下,允许的开始列表的格式如下
ARRAY ['<value for first filter><separator><value for second filter>...'....]
因此,为了允许执行 'User::setRole(21,' Moderator
) 方法,必须在默认切换 : 的允许值列表中包含值 21:Moderator '
。
该模块支持输入参数的类型检查。PHP 7 支持类型提示进行类型检查,但是,Access 行为更加智能
- 在 PHP 中,方法参数和返回类型只能有一个类型
protected static function setRole(int $id, string $role): void
如果我们想要类似于 C# 或 TypeScript 中的多类型类型设置
setMultiData (object: HTMLElement | NodeList, data: Object | Object[] | string = this.data): HTMLElement | NodeList
则原生 PHP 不允许这样做。
访问子系统的类型检查可以关注 PHPDOC 并测试如果指定在 PHPDOC 中,则多个类型的值
/**
* Set user role
*
* @accessMethod
*
* @accessFilter id, role
*
* @param int|string $id - user identifier
* @param string/IRole $role - user role
*
* @return UserAbstract|void
*/
protected static function actionSetRole(int $id, string $role)
{
//...
}
- 默认情况下,即使参数的值与其预期的类型不匹配,也可以将其视为“正确”,但是如果将值转换为预期类型(或预期类型之一)的模糊比较(==)中与原始值不同,则可以禁用此行为。可以通过指定方法 deny_fuzzy 配置指令的标记来禁用此行为。
此功能适用于控制器方法和模型方法。
该模块支持从控制器文件生成 API 方法的 URL。
只需在配置文件 Access 中指定所需的配置指令即可。
controllers:
- path:/var/www/project/controllers
method_prefix: action
namespace: App\controllers
自动生成并填写表 access.url
在配置文件中,您可以指定系统用户的角色
roles:
- Administrator
- Moderator
- Listener
- Guest
为什么这些角色可以与系统中注册的实际用户相关联,并为每个角色设置默认的访问权限。
尽管如此,任何用户的进一步访问权限都可以更改,无论初始权限集合如何——默认访问权限仅用于设置能够自动向用户授予一组权限。
该模块支持私有文件的访问权限管理。机制与API相同。实际上,系统仍然使用控制器的URL或私有文件的角落来工作。要生成文件的链接,只需设置存储这些文件的配置目录即可。
files:
-/var/www/project/view/private/materials
可以通过在urls指令中的配置文件中写入它们来简单地设置用于验证的附加URL。
urls:
-/var/www/project/file.jpg
-/var/www/project/get-a-lot-of-money
为了正确处理控制器方法,要处理控制器类必须继承自AccessControllerParent类。要检查方法模型中的参数,应从AccessServiceParent类继承模型类。
系统的主要数据存储是PostgreSQL。然而,用于授权检查的数据被缓存在Redis存储中。为了提高性能。
当更改主存储(PostgreSQL)中的数据时,触发器会自动更新缓存(Redis)中的数据。PostgreSQL进程的用户必须具有对Redis存储库的访问权限,以便触发器能够正确执行。
附加功能
-
支持在控制器方法成功执行前后添加回调。同时,这些flask可以相应地更改输入数据和结果。
-
在初始化期间,模块从数据库中检索所有数据库表的名字。将来,对这些表的操作将由权限检查子系统处理。您可以随意在数据库中编辑此信息。
-
除了数据库外,您还可以指定控制器方法类型,这也是API方法类型,以了解哪个方法将更改、删除、创建或读取,这对于在用户界面中过滤控制器方法可能很有用。