arc/grants

Ariadne 组件库:用户和组权限管理组件

3.0 2020-02-23 13:26 UTC

This package is auto-updated.

Last update: 2024-09-10 22:56:58 UTC


README

Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

一个灵活的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' 组的支持,需要有一个指向所有者树的链接,否则权限树会变得太大