arc / grants
Ariadne 组件库:用户和组权限管理组件
Requires
- php: >=7.1
- arc/base: ~3.0
Requires (Dev)
- phpunit/phpunit: 9.*
README
一个灵活的PHP组件库
Ariadne 组件库是从Ariadne Web应用框架和内容管理系统 [ http://www.ariadne-cms.org/ ] 分离出来的
工作原理
arc/grants 是一个简单且可扩展的系统,用于管理类似于文件系统的分层系统中的访问权限。在树的每个节点,您可以为一个特定的用户或组分配访问权限。没有预定义的权限,权限可以是任何单词。例如。
\arc\grants::cd('/foo/')->setForUser('public', 'read');
这为用户 'public' 在路径 '/foo/' 上分配了 'read' 权限。这个权限也自动应用于 '/foo/' 下的任何路径。例如。
$hasReadAccess = \arc\grants::cd('/foo/bar/')->checkForUser('public', 'read'); // returns true
您可以将多个权限作为空格分隔的字符串分配。
\arc\grants::setForUser('public', 'read add edit delete');
用户的权限不会叠加。如果您在某个位置为用户分配了权限,那么从该节点开始,这些将是唯一可用的权限。之前的权限将被覆盖。如果您想撤销权限,只需再次设置权限,而不包括您想要撤销的权限。要撤销所有权限,设置一个永远不会检查的 'marker' 权限,例如。
\arc\grants::cd('/foo/bar/')->setForUser('public', 'none');
权限字符串是一个简单的DSL(领域特定语言),允许您设置不会 '渗透' 的权限或仅在子节点上应用的权限
- '=read' 只在当前节点上分配权限。子节点不会拥有读取权限。
- '>delete' 只在子节点上分配权限,不在当前节点上。
默认用户和路径
您可以为权限系统分配一个默认用户
\arc\grants::switchUser('admin');
然后您可以为权限设置和检查它们,而无需指定用户
\arc\grants::set('read add edit >delete'); $hasReadAccess = \arc\grants::check('read');
如果您未使用 cd() 方法设置特定路径,则权限将针对 'default' 路径设置和检查。这是使用 \arc\grants::cd( $path ) 最后设置的路径,例如。
\arc\grants::cd('/foo/'); \arc\grants::switchUser('admin', ['administrators','public']); $hasReadAccess = \arc\grants::check('read');
这将检查用户 'admin' 在 '/foo/' 上的权限。任何后续调用 \arc\grants 都假定这是您想要使用的用户和路径。直到您再次调用 \arc\grants 类(静态)上的 cd() 或 switchUser()。
组
如果用户是一个或多个组的成员,您可以像这样设置
\arc\grants::setForGroup('administrators', 'read add edit delete');
然后您可以像这样进行检查
$hasReadAccess = \arc\grants::switchUser('admin', ['administrators','public'])->check('read');
组权限会添加到之前设置的任何用户权限。如果您在节点上设置了用户权限,则忽略父节点上设置的任何组权限。只有该节点下的组权限会被添加到用户权限。
如果您覆盖了特定组的权限,则只有较晚的组权限会被应用,但仅针对该特定组。
\arc\grants::cd('/') ->setForUser('mike', 'read edit') ->setForGroup('editors', 'read add edit >delete') ->cd('/foo/') ->setForGroup('editors', 'read');
因为 Mike 在 '/' 上有 'edit' 权限,所以组权限不能移除它,所以这起作用
$hasEditAccess = \arc\grants::switchUser('mike', ['editors'])->cd('/foo/')->check('edit'); // => true
因为 'editors' 组的权限 'read add edit >delete' 与 Mike 的个人权限在同一个节点上设置,所以它们被 Mike 的更严格的个人权限覆盖,所以这返回 false
$hasAddAccess = \arc\grants::switchUser('mike', ['editors'])->cd('/')->check('add'); // => false
最后,在 '/foo/' 上覆盖了 'editors' 组的权限,所以这也返回 false
$hasAddAccess = \arc\grants::switchUser('mike', ['editors'])->cd('/foo/')->check('add'); // => false
列出权限
这将返回特定节点上所有用户权限的列表。它只会返回在此特定节点上设置的权限,而不是当前所有适用权限的列表
$userGrantsList = \arc\grants::cd('/foo/')->grantsForAllUsers(); $groupGrantsList = \arc\grants::grantsForAllGroups();
两者都将返回一个数组,其中用户或组是键,权限字符串是值,如果没有设置权限,则为空字符串。
待办事项
- 添加对 'owner' 组的支持,需要有一个指向所有者树的链接,否则权限树会变得太大