【问题标题】:Tag authentication-manager with optional provider bean使用可选提供程序 bean 标记身份验证管理器
【发布时间】:2016-07-08 01:07:05
【问题描述】:

我有两个相互独立的弹簧轮廓,如下所示:

<beans profile="prof1">
    <security:authentication-manager id="authenticationManager" erase-credentials="true">
        <security:authentication-provider ref="1" />
        <security:authentication-provider ref="2" />
        <security:authentication-provider ref="3" />
    </security:authentication-manager>
</beans>

<beans profile="prof2" >
    <security:authentication-manager id="authenticationManager" erase-credentials="true">
        <security:authentication-provider ref="0" />
        <security:authentication-provider ref="1" />
        <security:authentication-provider ref="2" />
        <security:authentication-provider ref="3" />
    </security:authentication-manager>
</beans>

例如,我可以通过以下方式启用配置文件:

|prof1|prof2|
|true |true |
|true |false|
|false|true |
|false|false|

当指定最后一个选项时,spring 会抱怨 authentication-manager 丢失。

为了解决这个问题,我寻找了类似 “对 spring bean 的可选引用”

即想法是从配置文件中提取经理,如下所示:

 <security:authentication-manager id="authenticationManager" erase-credentials="true">
            <security:authentication-provider ref="0-optional-reference" />
            <security:authentication-provider ref="1" />
            <security:authentication-provider ref="2" />
            <security:authentication-provider ref="3" />
        </security:authentication-manager>

然后将名称为“0”的bean作为可选bean。我找到了以下帖子Optional Spring bean references,但看起来任何选项都对我不起作用,因为由于 spring xsd,我无法将“ref”属性替换为“value”。

如果知道任何选项会很好我如何为 authentication-provider spring 标签指定可选 bean。

【问题讨论】:

    标签: java spring spring-security xsd-validation


    【解决方案1】:

    Spring 抱怨,因为当两个配置文件都没有激活时,prof1prof2 &lt;beans&gt; 块中声明的 bean 定义没有被考虑在内,因此没有加载到 BeanFactory 中。 所以在运行时,Spring Security 找不到任何 AuthenticationManager 类型的 bean 并抱怨。

    您可以做的是在一个新的&lt;beans&gt; 块中声明一个“默认”AuthenticationManager,该块只有在prof1prof2 都没有激活时才会激活:

    <beans profile="!prof1 !prof2">
        <security:authentication-manager id="authenticationManager">
        ...
        </security:authentication-manager>
    </beans>
    

    【讨论】:

    • 感谢 Olivier 的及时答复。我只是在考虑两个配置文件都处于活动状态的情况。哪一个将被认为是有效的。看起来声明 , 都是有效的。
    • 当两个配置文件都处于活动状态时,2 AuthenticationManagers 可用于注入并具有相等的“权重”,这可能导致 Spring 抱怨它找到了给定 bean 类型的多个实现。要解决该问题,您可以将其中一个标记为“主要”:&lt;bean primary="true" .../&gt;,以便在注入查找期间优先。
    • 我已经为 beans 标签尝试过这个,但似乎 spring xsd 不允许设置这样的属性。是否可以指定任何其他属性?
    • “primary”属性必须设置在&lt;bean&gt; 标签上,而不是&lt;beans&gt;。既然你提到了它,我不确定专门的&lt;security:authentication-manager&gt; 标签是否可以直接承受它(我现在无法测试,抱歉)。如果没有,您将不得不使用普通的旧 bean 声明“手动”声明身份验证管理器。
    • 是的,但我没有 bean,只有上面指定的上下文。即 bean 内部的身份验证管理器。
    猜你喜欢
    • 2016-12-19
    • 2021-06-08
    • 2017-12-25
    • 2021-02-28
    • 2012-12-31
    • 2015-08-24
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多