我正在我的网络应用程序中实现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.SAMLUserDetailsService' 属性'userDetails'
请提供帮助。我将非常感激。
提前致谢
答案 0 :(得分:0)
在这里找到解决方案 https://github.com/spring-projects/spring-security/issues/2163
只需在身份验证管理器
中使用id而不是别名您不应该使用Spring bean。如果您没有指定ID, 您将覆盖“默认”实例。这几乎就是这样 标准的Spring bean工作。在引用的线程中,用户是 指定别名而不是ID,这样就不会创建 单独的实例。这也就是普通bean实例的工作方式 我不确定我们应该偏离那个。