spring security无法在classpath上找到元数据文件

时间:2014-11-25 22:05:07

标签: spring spring-security saml

我终于让SAML SSO处理我的应用程序,该应用程序用作SP。它使用生成的元数据,但我想为生产添加预定义的元数据。

我正在尝试配置我的ExtendedMetadataDelegate bean以查看包含我的SP元数据的xml文件,但是我无法确定将文件放在何处以便spring能够看到它。

spring文档说:"将元数据文件存储为项目类路径的一部分,例如在WEB-INF / classes / metadata / localhost_sp.xml中。"我试着把它放在那个确切的位置,它无法找到它。我尝试将它放在与我的密钥库相同的位置,该密钥库位于WEB-INF下。它似乎能够很好地找到密钥库,但它也无法在那里找到元数据。

有趣的是,当我使用如下配置的FilesystemMetadataProvider时,我的Windows系统可以找到该文件,但我的unix服务器和mac上的同事不能。当应用程序在基于unix的系统上启动时,这是错误消息:org.opensaml.saml2.metadata.provider.MetadataProviderException:Metadata file' /WEB-INF/blah/filename.xml'不存在 但是应用程序继续正常运行,SSO甚至可以运行。

                             /WEB-INF/blah/filename.xml                          

当我使用如下配置的ResourceBackedMetadataProvider时,我的系统甚至无法编译,因为它无法找到该文件。错误是:嵌套异常是org.opensaml.util.resource.ResourceException:类路径资源不存在:filename.xml

                                                            

我假设我需要在类路径上更改某些内容,但我不知道是否要更改构建类路径或运行类路径。我尝试将WEB-INF添加到运行类路径中,这似乎没有帮助。

提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

文档确实说明了:Store the metadata file as part of your project classpath, e.g. in WEB-INF/classes/metadata/localhost_sp.xml.

然而,和你一样,我得到类路径错误。当我把它放入时,我发现该应用程序始终如一地提到这一点:src/main/resources/metadata/localhost_sp.xml

如果您使用WEB-INF / classes / metadata /...

,则会出现以下错误
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.opensaml.util.resource.ClasspathResource#537c9fb7' defined in ServletContext resource [/WEB-INF/sec
urityContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.opensaml.util.resource.ClasspathResource]
: Constructor threw exception; nested exception is org.opensaml.util.resource.ResourceException: Classpath resource does not exist: /metadata/localhost_sp.xml

供参考,这里是加载此元数据sp的WEB-INF/securityContext.xml的相关部分。

<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/localhost_sp.xml"/>
                    </bean>
                </constructor-arg>
                <property name="parserPool" ref="parserPool"/>
            </bean>
        </constructor-arg>

总的来说,我发现Spring Security SAML难以使用/集成/理解。

答案 1 :(得分:1)

他们的关键是&#39; /&#39;价值观:

<bean class="org.opensaml.util.resource.ClasspathResource">
                        <constructor-arg value="/metadata/localhost_sp.xml"/>
                    </bean>