Spring security Spring Security多重身份验证提供程序无法访问第二个
我有一个使用Spring Security的应用程序,它使用的是自定义身份验证提供程序。我现在需要在混合中添加一个SAML IDP。因此,我启动并运行了示例SAML应用程序,并使用该安全上下文作为基础。我对经理的定义如下:Spring security Spring Security多重身份验证提供程序无法访问第二个,spring-security,saml,spring-saml,Spring Security,Saml,Spring Saml,我有一个使用Spring Security的应用程序,它使用的是自定义身份验证提供程序。我现在需要在混合中添加一个SAML IDP。因此,我启动并运行了示例SAML应用程序,并使用该安全上下文作为基础。我对经理的定义如下: <security:authentication-manager alias="authenticationManager"> <security:authentication-provider ref="myAuthenticationProvi
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="myAuthenticationProvider" />
<security:authentication-provider ref="samlAuthenticationProvider"/>
</security:authentication-manager>
现在,当我使用仅在SAML IDP中的用户名/密码提交登录表单时,我可以从日志中看到它调用myAuthenticationProvider,然后抛出一个BadCredentialsException,然后什么都没有。我没有看到任何其他异常,也没有看到SAMLAuthenticationProvider中的任何异常
我已经阅读了几次文档,它似乎表明这是可以做到的,但我没有看到一个例子。有人举过使用SAML和基本身份验证的例子吗?我认为您不需要为新的IDP添加额外的身份验证提供程序。你只需要添加一个新的??在您的CachingMetadataManager Bean中。在示例应用程序中提供的securityContext.xml中:
<!-- IDP Metadata configuration - paths to metadata of IDPs in circle of trust is here -->
<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
<constructor-arg>
<list>
<!-- Example of classpath metadata with Extended Metadata -->
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/idp.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
</bean>
</constructor-arg>
</bean>
<!-- Example of HTTP metadata without Extended Metadata -->
<bean class="org.opensaml.saml2.metadata.provider.HTTPMetadataProvider">
<!-- URL containing the metadata -->
<constructor-arg>
<value type="java.lang.String">http://idp.ssocircle.com/idp-meta.xml</value>
</constructor-arg>
<!-- Timeout for metadata loading in ms -->
<constructor-arg>
<value type="int">15000</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
<!-- Example of file system metadata without Extended Metadata -->
<bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
<constructor-arg>
<value type="java.io.File">/usr/local/metadata/idp.xml</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</list>
</constructor-arg>
</bean>
http://idp.ssocircle.com/idp-meta.xml
15000
/usr/local/metadata/idp.xml
如果取消注释列表中的第二个bean,它将启用在
/usr/local/metadata/IDP.xml
提供的xml文件中指定的另一个IDP。如果您想通过http添加另一个IDP的元数据,只需复制SSOCELL的元数据并进行调整。我认为您不需要为新的IDP添加额外的身份验证提供程序。你只需要添加一个新的??在您的CachingMetadataManager Bean中。在示例应用程序中提供的securityContext.xml中:
<!-- IDP Metadata configuration - paths to metadata of IDPs in circle of trust is here -->
<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
<constructor-arg>
<list>
<!-- Example of classpath metadata with Extended Metadata -->
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/idp.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
</bean>
</constructor-arg>
</bean>
<!-- Example of HTTP metadata without Extended Metadata -->
<bean class="org.opensaml.saml2.metadata.provider.HTTPMetadataProvider">
<!-- URL containing the metadata -->
<constructor-arg>
<value type="java.lang.String">http://idp.ssocircle.com/idp-meta.xml</value>
</constructor-arg>
<!-- Timeout for metadata loading in ms -->
<constructor-arg>
<value type="int">15000</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
<!-- Example of file system metadata without Extended Metadata -->
<bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
<constructor-arg>
<value type="java.io.File">/usr/local/metadata/idp.xml</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</list>
</constructor-arg>
</bean>
http://idp.ssocircle.com/idp-meta.xml
15000
/usr/local/metadata/idp.xml
如果取消注释列表中的第二个bean,它将启用在
/usr/local/metadata/IDP.xml
提供的xml文件中指定的另一个IDP。如果要通过http添加另一个IDP的元数据,只需复制SSOCIRCE的元数据并进行调整。这两个提供程序支持哪种身份验证?它们是否支持相同的身份验证类型?我猜你正在发送一个用户名PasswordAuthenticationToken,是吗?是的。我从代码中看到SAML应该为此失败——我认为。但我在日志里什么也没看到。我已经将SAML日志设置为罚款,我可以看到它绑定到东西。。。但没有错误。如果第一个authenticationProvider失败并引发异常,您应该处理该异常,并确保spring security继续执行筛选器的其余部分。此链接可能会有所帮助:哪种身份验证支持每个提供商?它们是否支持相同的身份验证类型?我猜你正在发送一个用户名PasswordAuthenticationToken,是吗?是的。我从代码中看到SAML应该为此失败——我认为。但我在日志里什么也没看到。我已经将SAML日志设置为罚款,我可以看到它绑定到东西。。。但没有错误。如果第一个authenticationProvider失败并引发异常,您应该处理该异常,并确保spring security继续执行筛选器的其余部分。此链接可能有助于: