scaleplan/access

此包最新版本(v0.1)没有可用的许可信息。

Scaleplan 访问控制系统

v0.1 2017-11-16 00:52 UTC

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_rightvalues 列)中包含 $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 行为更加智能

  1. 在 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)
    {
//...
    }
  1. 默认情况下,即使参数的值与其预期的类型不匹配,也可以将其视为“正确”,但是如果将值转换为预期类型(或预期类型之一)的模糊比较(==)中与原始值不同,则可以禁用此行为。可以通过指定方法 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存储库的访问权限,以便触发器能够正确执行。


附加功能
  1. 支持在控制器方法成功执行前后添加回调。同时,这些flask可以相应地更改输入数据和结果。

  2. 在初始化期间,模块从数据库中检索所有数据库表的名字。将来,对这些表的操作将由权限检查子系统处理。您可以随意在数据库中编辑此信息。

  3. 除了数据库外,您还可以指定控制器方法类型,这也是API方法类型,以了解哪个方法将更改、删除、创建或读取,这对于在用户界面中过滤控制器方法可能很有用。


类文档