如何利用先进的ACL的概念
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何利用先进的ACL的概念
本文的目的是给出一个更深入的ACL系统的观点,并解释其背后的一些设计决策。
设计概念
ob娱乐下载Symfony的对象实例的安全功能是基于一个访问控制列表的概念。每一个域对象实例有自己的ACL。ACL实例详细列表的访问控制项(ace)用于访问决策。ob娱乐下载Symfony的ACL系统关注的两个主要目标:
- 提供一种方式来有效地检索大量的acl / ace为您的域对象,并修改它们;
- 提供一种方式来轻松地做出决定一个人是否允许一个域对象上执行一个操作。
的第一点,Symfony的ACL系统的主要功能之一是一个高性能的方式检索ACL / ace。ob娱乐下载这是非常重要的,因为每个ACL可能有一些ace,并继承另一个ACL以树形方式。因此,没有利用ORM,而不是默认实现使用原则的DBAL直接与您的连接。
对象的身份
ACL系统是完全脱离你的域对象。他们甚至不需要存储在同一个数据库中,或在同一台服务器上。为了实现解耦,ACL系统对象表示通过对象标识对象。每次你想为一个域对象检索ACL, ACL系统将首先从你的域对象创建一个对象的身份,然后通过这个对象身份到ACL提供者进行进一步处理。
安全身份
这是模拟对象的身份,但代表一个用户,或在您的应用程序。每个角色或用户有自己的安全标识。
谨慎
对于用户来说,安全身份是基于用户名。这意味着,如果因为任何原因,用户的用户名是改变,你必须确保其安全标识更新。的MutableAclProvider: updateUserSecurityIdentity ()方法来处理更新。
数据库表结构
默认实现使用五个数据库表如下所示。表从至少行大多数行订购在一个典型的应用程序:
- acl_security_identities:此表记录所有安全身份持有ace (SID)。默认实现附带两个安全标识:RoleSecurityIdentity和UserSecurityIdentity。
- acl_classes:此表类名映射到一个惟一的ID,可以引用其他表。
- acl_object_identities:此表中每一行代表一个单独的域对象实例。
- acl_object_identity_ancestors:这个表允许所有的祖先ACL决定在一个非常有效的方法。
- acl_entries:此表包含所有的ace。这通常是最多的表行。它可以包含数千万没有显著地影响性能。
访问控制条目的范围
访问控制条目可以有不同的应用范围。在Syob娱乐下载mfony中,基本上有两个不同的范围:
- 类范围:适用于所有这些条目对象相同的类。
- Object-Scope:这是使用的范围只在前一篇文章中,它只适用于一个特定的对象。
有时,你会发现只需要申请一个王牌特定字段的对象。假设你想要ID只可以由管理员,但不是由你的客户服务。为了解决这个普遍的问题,增加了两个sub-scopes:
- Class-Field-Scope:适用于所有这些条目对象相同的类,但只有特定字段的对象。
- Object-Field-Scope:适用于一个特定的对象,这些条目,只到一个特定的字段的对象。
预先授权决策
预先授权决策,决策之前任何安全的方法调用(或安全措施),证明AccessDecisionManager服务使用。AccessDecisionManager也可以用于实现基于角色的授权决策。就像角色,ACL系统添加了一些新的属性可用于检查不同的权限。
内置权限映射
属性 | 的目的意义 | 整数位掩码 |
---|---|---|
视图 | 是否有人可以把域对象。 | 查看、编辑操作符、主人或所有者 |
编辑 | 是否有人可以更改域对象。 | 编辑、运营商、主人或所有者 |
创建 | 是否有人可以创建域对象。 | 创建、操作符、主人或所有者 |
删除 | 某人是否允许删除域对象。 | 删除、运营商、主人或所有者 |
恢复删除 | 是否有人可以恢复以前删除的域对象。 | 恢复,运营商、主人或所有者 |
操作符 | 是否有人可以执行上述操作。 | 符、主人或所有者 |
主 | 是否有人可以执行上述操作,除了上述不得授予任何权限给其他人。 | 主人,或所有者 |
老板 | 一个人是否拥有域对象。上面的一个所有者可以执行任何操作和格兰特大师和所有者权限。 | 老板 |
权限属性与权限位掩码
AccessDecisionManager属性使用,就像角色。通常,这些属性代表事实上一个聚合的整数位掩码。使用整数位掩码另一方面,ACL系统内部有效存储用户的权限在数据库中,并使用极快位掩码操作执行访问检查。
可扩展性
上述许可地图绝不是静态的,理论上可以完全取代。然而,它应该能覆盖大多数你遇到的问题,与其他包的互操作性,鼓励你坚持为他们设想的意义。
职务授权决策
职务授权决策是由在一个安全的方法被调用时,通常涉及到域对象就是由这样一个方法返回。后调用提供者也允许修改或过滤域对象之前返回。
由于当前的PHP语言的局限性,没有内置post-authorization功能核心安全组件。然而,有一个实验JMSSecurityExtraBundle增加这些功能。看到它这是如何完欧宝官网下载app成的文档了解更多信息。
达到授权决策的过程
ACL类提供了两个方法来确定一个安全标识是否具有所需的位掩码,isGranted ()
和isFieldGranted ()
。当ACL授权请求到一个通过这些方法之一,它代表这个请求的实现PermissionGrantingStrategy。这允许您替换访问决策的方式达到不用修改ACL类本身。
的PermissionGrantingStrategy
首先检查你所有的object-scope ace。如果适用,类范围ace将检查。如果没有适用的,那么这个过程会重复的ace父ACL。如果没有父母ACL存在,就会抛出一个异常。