我的应用程序中有五个自定义选民并使用策略“一致”。
有时我的选民不能正常工作,经过调试后我找到了原因。
标准的Symfony RoleHierarchyVoter始终返回“1”,因此“授予”的总和会将等于与“拒绝”结果的总和相加。所以,我需要禁用此选民,因为我不使用RoleHierarchy。
1)如何在配置中禁用选民?
2)是否存在此问题的另一种解决方案?
非常感谢您的帮助!
更新。
所以,我创建了自己的RoleHierarchyVoter,它总是返回false。 这个Voter取代了标准选民,但我不确定这个解决方案是否真实。 也许还有其他解决方案吗?
答案 0 :(得分:2)
所以,目前我通过创建自己的RoleHierarchyVoter 解决了这个问题,返回false 。
目前无法删除标准RoleHierarchyVoter的定义,因为它以优先级TYPE_BEFORE_OPTIMIZATION注册并在我自己的编译器之前执行。
顺便说一下,您可以在 SecurityBundle / DependencyInjection / SecurityExtension.php 下一行找到:
private function createRoleHierarchy($config, ContainerBuilder $container)
{
if (!isset($config['role_hierarchy'])) {
$container->removeDefinition('security.access.role_hierarchy_voter');
return;
}
$container->setParameter('security.role_hierarchy.roles', $config['role_hierarchy']);
$container->removeDefinition('security.access.simple_role_voter');
}
即使我设置了role_hierarchy: ~
,isset($config['role_hierarchy']
也会返回true。
答案 1 :(得分:0)
RoleVoter
的文档说:
RoleVoter votes if any attribute starts with a given prefix.
RoleVoter
将检查的默认前缀是ROLE_
,在构造函数中作为默认参数值传递。这些是必需的,因为选民必须检查当前登录的用户。
确保您自己的选民实施VoterInterface
并检查选民对YourVoter::supportsClass
的实施情况。应该在那里检查您想要知道用户有权访问的元素的FQN。那么以下配置就足够了:
app.security.download_voter:
class: AppBundle\Security\Voter\DownloadVoter
public: false
tags:
- { name: security.voter }
所以:
1)你不应该禁用这个选民,因为所有其他选民都依赖于此选民在通过投票时为当前用户创建的RoleHierarchy
。
2)为了更好地理解Voter
,您可以让DIC在logger
中注入voter
,并向分析器添加额外信息。这样你自己的选民就不再是黑匣子了。