在Web应用程序中使用Symfony2中的ACL实现时,我们遇到了一个用例,其中建议的使用ACL的方法(检查单个域对象的用户权限)变得不可行.因此,我们想知道是否存在可用于解决问题的ACL API的某些部分.
用例位于控制器中,该控制器准备要在模板中呈现的域对象列表,以便用户可以选择她想要编辑的对象.用户无权编辑数据库中的所有对象,因此必须相应地过滤列表.
这可以(根据其他解决方案)根据两种策略完成:
1)一个查询过滤器,它使用当前用户的ACL为对象(或多个对象)附加有效对象id的给定查询.即:
WHERE <other conditions> AND u.id IN(<list of legal object ids here>)
Run Code Online (Sandbox Code Playgroud)
2)一个查询后过滤器,用于删除用户在从数据库中检索完整列表后没有正确权限的对象.即:
$objs = <query for objects>
$objIds = <getting all the permitted obj ids from the ACL>
for ($obj in $objs) {
if (in_array($obj.id, $objIds) { $result[] = $obj; }
}
return $result;
Run Code Online (Sandbox Code Playgroud)
第一种策略是可取的,因为数据库正在进行所有过滤工作,并且都需要两次数据库查询.一个用于ACL,一个用于实际查询,但这可能是不可避免的.
在Symfony2中是否有任何一种策略(或实现预期结果)的实现?
在使用Symfony2构建的应用程序中,我们希望superadmins能够模仿其他用户.通过为superadmin用户提供ROLE_ALLOWED_TO_SWITCH角色,可以轻松完成此操作.通过调用"somewhere?_switch_user ="来实现切换,如参考文档中所述.
然而,问题是在模板中检测当前用户是否实际被模拟,以便在页面上打印到"某处?_switch_user = _exit"的链接,从而使模仿用户能够返回到她的真实用户.
在我们基于Symfony2的应用程序中,我们想要创建一个列表,列出系统中哪些用户对给定的域对象具有权限.我们正在使用ACL,我们的直接本能是查看从相关域对象的ACLProvider返回的ACL对象,以查找可以返回具有权限的用户(或至少是SecurityIdentities)的方法,但我找不到这样的方法.
我们确信此功能可通过API获得,但我们无法找到隐藏这些方法的位置.
编辑另一种方法是直接在acl-tables中查找这些连接并找出那种方式,但它不是很漂亮,我们可能会重新发明轮子.