【问题标题】:Symfony 2 override existing service definition in config?Symfony 2 覆盖配置中现有的服务定义?
【发布时间】:2014-03-05 13:52:27
【问题描述】:

供应商/symfony/symfony/src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml

    <service id="security.access.role_hierarchy_voter" class="%security.access.role_hierarchy_voter.class%" public="false">
        <argument type="service" id="security.role_hierarchy" />
        <tag name="security.voter" priority="245" />
    </service>

已定义。服务类,Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter 有第二个参数$prefix = 'ROLE_' 作为默认值。

在上面的服务定义中,第二个参数没有传递,所以它会采用默认值ROLE_

在我的应用程序中,我有旧角色,例如登录。没有ROLE_ 前缀。

我想覆盖上面的服务定义并将第二个参数传递为空。

         <service id="security.access.role_hierarchy_voter" class="%security.access.role_hierarchy_voter.class%" public="false">
            <argument type="service" id="security.role_hierarchy" />
            <argument></argument>
            <tag name="security.voter" priority="245" />
        </service>

我该怎么做?

【问题讨论】:

    标签: php symfony fosuserbundle


    【解决方案1】:

    您可以创建一个扩展 Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter 的新类。

    在你创建的类中,前缀在你的控制之下,你要做的只是改变构造方法。

    代码:

    public function __construct(RoleHierarchyInterface $roleHierarchy)
    {
        parent::__construct($roleHierarchy, 'THE_PREFIX_YOU_WANT_TO_SET');
    }
    

    然后将参数security.access.role_hierarchy_voter.class设置为你创建的类。

    编辑:

    使用空字符串设置前缀可能会导致警告,覆盖RoleVotersupportAttribute是另一种解决方案。

    【讨论】:

    • 谢谢,它有效,但还有另一个问题,因为我不想要前缀,我传递的是空字符串,并且在 vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authorization /Voter/RoleVoter.php, supportsAttribute() 0 === strpos($attribute, $this->prefix);在 $this->prefix 为空时给出警告
    • 我认为,最好覆盖 RoleVoter 并从 supportAttribute 始终返回 true ?
    • @user1191081 是的,试试看 :)
    • 是的,它奏效了。谢谢。你想修改你的答案吗?
    • 实际上不需要重写 RoleHierarchyVote,添加了完整的工作解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多