如何利用先进的ACL的概念
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何利用先进的ACL的概念
3.4
ACL支持在Symfony弃用3.4和4.0将被删除。ob娱乐下载安装ob娱乐下载Symfony ACL包如果你想继续使用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存在,就会抛出一个异常。