如何使用高级ACL概念
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用高级ACL概念
本章的目的是更深入地介绍ACL系统,并解释它背后的一些设计决策。
设计概念
ob娱乐下载Symfony的对象实例安全功能基于访问控制列表的概念。每个域对象实例有自己的ACL。ACL实例包含用于做出访问决策的访问控制项(ace)的详细列表。ob娱乐下载Symfony的ACL系统侧重于两个主要目标:
- 提供了一种有效检索域对象的大量acl / ace并修改它们的方法;
- 提供一种方法,方便地决定是否允许某人对域对象执行操作。
如第一点所示,Symfony的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娱乐下载mfony中,有两种不同的作用域:
- 类作用域:这些条目应用于具有相同类的所有对象。
- 对象作用域:这是前一章中单独使用的作用域,它只适用于一个特定的对象。
有时,您会发现只需要将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。如果不适用,则检查类范围ACEs。如果都不适用,则父ACL的ace将重复此过程。如果不存在父ACL,则抛出异常。