如何使用高级ACL概念

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何使用高级ACL概念

本章的目的是更深入地介绍ACL系统,并解释它背后的一些设计决策。

设计概念

ob娱乐下载Symfony2的对象实例安全功能基于访问控制列表的概念。每个域对象实例有自己的ACL。ACL实例包含用于做出访问决策的访问控制项(ace)的详细列表。ob娱乐下载Symfony2的ACL系统侧重于两个主要目标:

  • 提供了一种有效检索域对象的大量acl / ace并修改它们的方法;
  • 提供一种方法,方便地决定是否允许某人对域对象执行操作。

如第一点所示,Symfony2的ACL系统的主要功能之一是检索ACL / ace的高性能方法。ob娱乐下载这是非常重要的,因为每个ACL可能有几个ace,并以树状方式从另一个ACL继承。因此,没有使用ORM,而是默认实现直接使用Doctrine的DBAL与连接进行交互。

对象的身份

ACL系统与域对象完全解耦。它们甚至不必存储在同一个数据库或同一台服务器上。为了实现这种解耦,在ACL系统中,对象是通过对象标识对象表示的。每当您希望检索域对象的ACL时,ACL系统将首先从您的域对象创建一个对象标识,然后将该对象标识传递给ACL提供程序以进行进一步处理。

安全身份

这类似于对象标识,但表示应用程序中的用户或角色。每个角色或用户都有自己的安全标识。

数据库表结构

默认实现使用如下所示的五个数据库表。在典型的应用程序中,表是按行数从少到多的顺序排列的:

  • acl_security_identities:该表记录所有持有ace的SID (security identity)。默认实现附带两个安全标识:RoleSecurityIdentity,UserSecurityIdentity
  • acl_classes:这个表将类名映射到一个唯一的id,这个id可以被其他表引用。
  • acl_object_identities:表中的每一行表示一个域对象实例。
  • acl_object_identity_ancestors:该表可以非常有效地确定ACL的所有祖先。
  • acl_entries:包含所有ace。这通常是行最多的表。它可以包含数千万个,而不会对性能产生显著影响。

访问控制项的范围

访问控制项可以应用于不同的作用域。在Syob娱乐下载mfony2中,基本上有两种不同的作用域:

  • 类作用域:这些条目应用于具有相同类的所有对象。
  • 对象作用域:这是前一章中单独使用的作用域,它只适用于一个特定的对象。

有时,您会发现只需要将ACE应用于对象的特定字段。假设您希望该ID只能由管理员查看,而不能由您的客户服务查看。为了解决这个常见问题,添加了两个子作用域:

  • class - field - scope:这些条目适用于具有相同类的所有对象,但仅适用于对象的特定字段。
  • object - field - scope:这些条目应用于特定的对象,并且仅应用于该对象的特定字段。

预先授权决策

对于预授权决策,即在调用任何安全方法(或安全操作)之前做出的决策,将使用经过验证的AccessDecisionManager服务。AccessDecisionManager还用于基于角色达成授权决策。就像角色一样,ACL系统添加了几个新的属性,可以用来检查不同的权限。

内置权限映射

属性 的目的意义 整数位掩码
视图 是否允许某人查看域对象。 查看,编辑,操作符,主,或所有者
编辑 是否允许某人对域对象进行更改。 编辑、操作符、主或所有者
创建 是否允许某人创建域对象。 创建、操作符、主或所有者
删除 是否允许某人删除域对象。 DELETE、OPERATOR、MASTER或OWNER
恢复删除 是否允许某人恢复以前删除的域对象。 取消删除、操作符、主或所有者
操作符 是否允许某人执行上述所有操作。 操作员,主人或所有者
是否允许某人执行上述所有操作,以及是否允许将上述任何权限授予其他人。 主人或船主
老板 是否有人拥有域对象。所有者可以执行上述任何操作而且授予管理员和所有者权限。 老板

权限属性与权限位掩码

属性由AccessDecisionManager使用,就像角色一样。通常,这些属性实际上表示整数位掩码的集合。另一方面,ACL系统内部使用整数位掩码来有效地在数据库中存储用户的权限,并使用极快的位掩码操作执行访问检查。

可扩展性

上述权限映射绝不是静态的,理论上可以完全随意替换。但是,它应该涵盖您遇到的大多数问题,对于与其他捆绑包的互操作性,鼓励您坚持为它们设想的意义。

职位授权决定

后授权决策是在调用安全方法之后做出的,通常涉及由该方法返回的域对象。调用提供者还允许在返回域对象之前修改或筛选域对象。

由于当前PHP语言的限制,核心Security组件中没有内置授权后功能。然而,有一种实验性的方法JMSSecurityExtraBundle它增加了这些功能。有关如何实现这一欧宝官网下载app点的进一步信息,请参阅其文档。

达成授权决策的过程

ACL类提供了两种方法来确定安全标识是否具有所需的位掩码,isGranted而且isFieldGranted.当ACL通过这些方法之一接收到授权请求时,它将此请求委托给PermissionGrantingStrategy的实现。这允许您替换访问决策的方式,而无需实际修改ACL类本身。

PermissionGrantingStrategy首先检查所有对象范围的ace(如果不适用),然后检查类范围的ace(如果不适用),然后对父ACL的ace重复该过程。如果不存在父ACL,则抛出异常。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。