yiisoft / rbac-php
Yii RBAC PHP 文件存储
Requires
- php: ^8.1
- yiisoft/rbac: ^2.0
- yiisoft/var-dumper: ^1.7
Requires (Dev)
- ext-uopz: *
- maglnet/composer-require-checker: ^4.3
- phpunit/phpunit: ^10.5.2
- psr/log: ^1.1.3
- rector/rector: ^1.0.0
- roave/infection-static-analysis-plugin: ^1.18
- slope-it/clock-mock: 0.4.0
- spatie/phpunit-watcher: ^1.23
- vimeo/psalm: ^4.30|^5.17
- yiisoft/files: ^1.0
This package is auto-updated.
Last update: 2024-08-23 04:09:25 UTC
README
Yii RBAC PHP 文件存储
此包为RBAC (基于角色的访问控制)包提供基于PHP文件的存储。
需求
- PHP 8.1 或更高版本。
安装
可以使用Composer安装此包。
composer require yiisoft/rbac-php
有关RBAC包安装说明,请参阅yiisoft/rbac。
通用用法
该存储适合不太大的授权数据(例如,个人博客系统的授权数据)或相对静态的RBAC层次结构。
授权数据存储在PHP文件中。PHP应该能够读写这些文件。任何写操作都会自动创建不存在的文件。
使用存储
存储不打算直接使用。相反,请使用来自Yii RBAC包的Manager
。
use Yiisoft\Rbac\Manager; use Yiisoft\Rbac\Permission; use Yiisoft\Rbac\Php\AssignmentsStorage; use Yiisoft\Rbac\Php\ItemsStorage; use Yiisoft\Rbac\RuleFactoryInterface; $directory = __DIR__ . '/rbac'; $itemsStorage = new ItemsStorage($directory . '/items.php'); $assignmentsStorage = new AssignmentsStorage($directory . '/assignments.php'); /** @var RuleFactoryInterface $rulesContainer */ $manager = new Manager( itemsStorage: $itemsStorage, assignmentsStorage: $assignmentsStorage, // Requires https://github.com/yiisoft/rbac-rules-container or other compatible factory. ruleFactory: $rulesContainer, ), $manager->addPermission(new Permission('posts.create'));
请注意,没有必要同时使用两种PHP存储。结合不同的实现是可能的。一个非常流行的案例是在PHP文件中管理项目,同时在数据库中存储分配(参见Cycle和Yiisoft DB实现)。
更多示例可以在Yii RBAC文档中找到。
文件结构
如果您决定手动编辑文件,请确保保持以下结构。
项目
必需和可选字段
return [ [ 'name' => 'posts.update', 'description' => 'Update a post', // Optional 'rule_name' => 'is_author', // Optional 'type' => 'permission', // or 'role' 'created_at' => 1683707079, // UNIX timestamp, optional 'updated_at' => 1683707079, // UNIX timestamp, optional ], ];
虽然维护创建和更新时间戳是推荐的,但如果缺少任何,则将使用文件修改时间作为后备。
具有子项的项目结构
return [ [ 'name' => 'posts.redactor', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.viewer', 'posts.create', 'posts.update', ], ], ];
管理帖子示例
return [ [ 'name' => 'posts.admin', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.redactor', 'posts.delete', 'posts.update.all', ], ], [ 'name' => 'posts.redactor', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.viewer', 'posts.create', 'posts.update', ], ], [ 'name' => 'posts.viewer', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.view', ], ], [ 'name' => 'posts.view', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.create', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.update', 'rule_name' => 'is_author', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.delete', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.update.all', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], ];
分配
return [ [ 'item_name' => 'posts.redactor', 'user_id' => 'john', 'created_at' => 1683707079, // Optional ], // ... [ 'item_name' => 'posts.admin', 'user_id' => 'jack', 'created_at' => 1683707079, ], ];
虽然维护创建时间戳是推荐的,但如果缺少,则将使用文件修改时间作为后备。
并发性
默认情况下,与PHP存储一起工作不支持并发。如果您的文件存储在VCS下,这可能没问题。如果您的场景不同,例如,使用某种类型的Web界面,那么要启用并发性,请勿直接使用存储 - 而是使用装饰器包装它
use Yiisoft\Rbac\Manager; use Yiisoft\Rbac\Permission; use Yiisoft\Rbac\Php\AssignmentsStorage; use Yiisoft\Rbac\Php\ConcurrentAssignmentsStorageDecorator; use Yiisoft\Rbac\Php\ConcurrentItemsStorageDecorator; use Yiisoft\Rbac\Php\ItemsStorage; use Yiisoft\Rbac\RuleFactoryInterface; $directory = __DIR__ . DIRECTORY_SEPARATOR . 'rbac'; $itemsSstorage = new ConcurrentItemsStorageDecorator(ItemsStorage($directory)); $assignmentsStorage = new ConcurrentAssignmentsStorageDecorator(AssignmentsStorage($directory)); /** @var RuleFactoryInterface $rulesContainer */ $manager = new Manager( itemsStorage: $itemsStorage, assignmentsStorage: $assignmentsStorage, // Requires https://github.com/yiisoft/rbac-rules-container or other compatible factory. ruleFactory: $rulesContainer, ),
请注意,这将对性能产生影响,因此除非您真的需要,否则不要使用它。
配置文件更新时间
可以使用闭包自定义获取文件修改时间
use Yiisoft\Rbac\Php\AssignmentsStorage; use Yiisoft\Rbac\Php\ItemsStorage; $directory = __DIR__ . '/rbac', $getFileUpdatedAt = static fn (string $filePath): int|false => @filemtime($filePath) $itemsStorage = new ItemsStorage( $directory . '/items.php', getFileUpdatedAt: static fn (string $filePath): int|false => @filemtime($filePath), ); $itemsStorage = new AssignmentsStorage( $directory . '/assignments.php', getFileUpdatedAt: static fn (string $filePath): int|false => @filemtime($filePath), );
这有两个用途
- 用于文件手动编辑时为空的时间戳。
- 启用并发时检测文件更改。这有助于通过防止不必要的加载(当文件内容未更改时)来优化性能。
手动同步存储
由于管理器,存储保持同步,但可能存在需要手动同步的情况。其中之一是手动编辑存储。
假设PHP文件用于项目和分配,并且删除了一些项目。
return [ [ 'name' => 'posts.admin', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.redactor', 'posts.delete', 'posts.update.all', ], ], - [ - 'name' => 'posts.redactor', - 'type' => 'role', - 'created_at' => 1683707079, - 'updated_at' => 1683707079, - 'children' => [ - 'posts.viewer', - 'posts.create', - 'posts.update', - ], - ], [ 'name' => 'posts.viewer', 'type' => 'role', 'created_at' => 1683707079, 'updated_at' => 1683707079, 'children' => [ 'posts.view', ], ], [ 'name' => 'posts.view', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.create', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], - [ - 'name' => 'posts.update', - 'rule_name' => 'is_author', - 'type' => 'permission', - 'created_at' => 1683707079, - 'updated_at' => 1683707079, - ], [ 'name' => 'posts.delete', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], [ 'name' => 'posts.update.all', 'type' => 'permission', 'created_at' => 1683707079, 'updated_at' => 1683707079, ], ];
然后需要删除分配存储中的相关条目
return [ - [ - 'item_name' => 'posts.redactor', - 'user_id' => 'john', - 'created_at' => 1683707079, - ], [ 'item_name' => 'posts.admin', 'user_id' => 'jack', 'created_at' => 1683707079, ], ];
当使用数据库作为二级存储时,这可以在迁移过程中完成。根据所选的实现方式,请参考RBAC Cycle 示例或RBAC DB 示例。
文档
如果您需要帮助或有任何疑问,可以访问Yii 论坛。您还可以查看其他Yii 社区资源。
许可协议
Yii RBAC PHP 文件存储是免费软件。它根据BSD许可证条款发布。有关更多信息,请参阅LICENSE
。
由Yii 软件维护。