如何将authenticationManager编写为bean(将SamlAuthenticationManager转换为bean)

时间:2017-05-21 10:13:55

标签: java spring spring-security saml-2.0 spring-saml

我正在我的网络应用程序中实现Spring SAML,该应用程序已经实现了spring安全性,因此我现在有2个身份验证管理器。由于spring始终引用最后声明的authenticationManager,因此我找到了将一个authenticationManager定义为bean的解决方案。

以下是我在转换为bean之前的AuthenticationManager:

<authentication-manager alias="samlAuthenticationManager">
    <!-- Register authentication manager for SAML provider -->
    <authentication-provider ref="samlAuthenticationProvider"/>
    <!-- Register authentication manager for administration UI -->
    <authentication-provider>
        <user-service id="adminInterfaceService">
            <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
        </user-service>
    </authentication-provider>
</authentication-manager>

以下是转换为bean后的代码:

<beans:bean id="samlAuthenticationManager" class="org.springframework.security.authentication.ProviderManager">
    <beans:constructor-arg>
        <beans:list>
            <beans:bean class="org.springframework.security.saml.SAMLAuthenticationProvider">
                <beans:property name="userDetails" value="adminInterfaceService"/>
            </beans:bean>
        </beans:list>
    </beans:constructor-arg>
</beans:bean>
<user-service id="adminInterfaceService">
    <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
</user-service>

身份验证提供程序定义如下:

<beans:bean id="samlAuthenticationProvider" class="org.springframework.security.saml.SAMLAuthenticationProvider">
        <!-- OPTIONAL property: can be used to store/load user data after login -->
        <!--
        <beans:property name="userDetails" ref="bean" />
        -->
</beans:bean>

我遇到以下异常:

  

无法将'java.lang.String'类型的值转换为所需类型   'org.springframework.security.saml.userdetails.SAMLUserDetailsS​​ervice'   属性'userDetails'

请提供帮助。我将非常感激。

提前致谢

1 个答案:

答案 0 :(得分:0)

在这里找到解决方案 https://github.com/spring-projects/spring-security/issues/2163

只需在身份验证管理器

中使用id而不是别名
  

您不应该使用Spring bean。如果您没有指定ID,   您将覆盖“默认”实例。这几乎就是这样   标准的Spring bean工作。在引用的线程中,用户是   指定别名而不是ID,这样就不会创建   单独的实例。这也就是普通bean实例的工作方式   我不确定我们应该偏离那个。