gtt/reverse-search-acl

为 Symfony 的 ACL 基础设施提供了一种方法,用于找到指定的安全身份可以访问的对象标识(如具有指定权限(如查看、编辑等)的对象标识)

1.0.0 2016-11-02 15:35 UTC

This package is auto-updated.

Last update: 2024-09-07 23:59:27 UTC


README

Build Status Latest Stable Version Latest Unstable Version License

这个库扩展了基础 Symfony 的 MutableAclProvider,增加了为指定安全身份查找可访问对象标识的能力。您还可以指定授予目标安全身份的权限 Ace。

这个库提供了一个方便的方法来创建基于 ACL 的系统的管理界面,其中您需要显示为请求的系统中的单个用户分配的域对象和权限。

需求

库需要 Symfony 的 security-acl 包和 doctrine/dbal 组件来与 acl 数据库交互。

它是如何工作的?

如上所述,该库包含扩展的 acl 提供商 - ReverseSearchAclProvider。基本上里面没有更多内容。这个提供商的主要目标是执行对 PermissionGrantingStrategy 的反向操作,该操作检查指定的 SecurityIdentity 是否可以访问指定的 ObjectIdentity(访问类型受权限限制,例如:查看、编辑等)。由于性能原因(实际上在设计 Symfony 的 ACL 系统时已经考虑到了这一点),ReverseSearchAclProvider 通过构建和执行类似于 AclProvider 中的其他语句的 PDO 语句来解决此任务。

安装

可以通过 composer 很容易地安装库。

composer require gtt/reverse-search-acl

使用方法

为了创建 ReverseSearchAclProvider 的实例,您需要指定与 MutableAclProvider 所需的相同构造函数参数,并在列表开头添加 PermissionMapInterface 的实例(因为 ReverseSearchAclProvider 需要将指定的权限转换为掩码)。

use Gtt\Acl\Dbal\ReverseSearchAclProvider;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Permission\BasicPermissionMap;
use Symfony\Component\Security\Acl\Permission\BasicPermissionMap;
use Doctrine\DBAL\DriverManager;

$provider = new ReverseSearchAclProvider(
    new BasicPermissionMap()
    DriverManager::getConnection(['driver' => 'pdo_sqlite','memory' => true],
    new PermissionGrantingStrategy(),
    [] // list of base acl provider options
);

现在,您已经准备好查找哪些域对象(或类本身或类/对象字段)可以查看(权限查看)某些用户或角色。

$sid = UserSecurityIdentity::fromAccount(new User('jimmy', 'jimmypass'));
// you can also analyse roles
// $sid = new RoleSecurityIdentity('ROLE_ADMIN');

$allowed = $provider->findAllowedEntries($sid, "VIEW")

返回的结果将是一个具有以下结构的数组

[
    // the key is FQCN of the class of the object that can be accessed by specified Security Identity instance (SID)
    '\F\Q\C\N' => [
        // if this flag is presented class ace was inserted for current SID
        'class_access'        => true,
        // list of class field's granted to current SID
        'class_field_access'  => ['field1', 'field2', 'field3'],
        // id of the domain objects accessible by current SID
        'object_access'       => ['id1', 'id2', 'id3', 'id4'],
        // list of domain object fields (grouped by object id) granted to current SID
        'object_field_access' => [
           'id2' => ['field1', 'field2'],
           'id5' => ['field3']
        ]
    ]
]

您还可以通过指定要检索的可访问对象标识的类和/或字段来限制搜索

$allowed = $provider->findObjectIdentities(
    $sid,
    "VIEW",
    ['class' => \My\Domain\Object\Class]
);

限制

  • 请注意,库的反向操作 PermissionGrantingStrategy。只有如果您确切知道您正在做什么,才应与其他库一起使用。

  • 如果您同时使用对象和类 Ace(或对象字段和类字段 Ace),请注意,在访问决策过程中,PermissionGrantingStrategy 会依次检查对象级和类级 ACE,以授予或拒绝访问。提供程序分别返回对象和类的访问信息,因此为了确保当前 SID 可以访问当前对象,您应该考虑类和对象访问信息(即对象访问/类访问或对象字段访问/类字段访问)。

  • 如果您正在使用 PermissionMapInterface 实例,请注意在检索掩码过程中确实考虑了指定的对象(PermissionMapInterface::getMasks 方法的第二个参数),因为它们在获取掩码过程中考虑了指定的对象(目前 Symfony 中没有这样的 PermissionMapInterface 实现,但无论如何)。