0

我正在尝试使用Apache Camel LDAPSpring Security构建集成测试。不幸的是,当我尝试在启动时使用 LDIF(从ApacheDS 用户指南下载)预填充嵌入式Apache DS时,它会引发以下错误:

启动时的错误信息

2013-06-27 09:51:32,002 [main           ] INFO  AbstractContextLoader          - Detected default resource location "classpath:/eu/hermes/esb/gateway/LdapRouteTest-context.xml" for test class [eu.hermes.esb.gateway.LdapRouteTest].
2013-06-27 09:51:32,003 [main           ] INFO  DelegatingSmartContextLoader   - GenericXmlContextLoader detected default locations for context configuration [ContextConfigurationAttributes@16ba8602 declaringClass = 'eu.hermes.esb.gateway.LdapRouteTest', locations = '{classpath:/eu/hermes/esb/gateway/LdapRouteTest-context.xml}', classes = '{}', inheritLocations = true, contextLoaderClass = 'org.springframework.test.context.ContextLoader'].
2013-06-27 09:51:32,003 [main           ] INFO  AnnotationConfigContextLoader  - Could not detect default configuration classes for test class [eu.hermes.esb.gateway.LdapRouteTest]: LdapRouteTest does not declare any static, non-private, non-final, inner classes annotated with @Configuration.
2013-06-27 09:51:32,005 [main           ] INFO  TestContextManager             - @TestExecutionListeners is not present for class [class eu.hermes.esb.gateway.LdapRouteTest]: using defaults.
2013-06-27 09:51:32,097 [main           ] INFO  XmlBeanDefinitionReader        - Loading XML bean definitions from class path resource [eu/hermes/esb/gateway/LdapRouteTest-context.xml]
2013-06-27 09:51:32,356 [main           ] INFO  SpringSecurityCoreVersion      - You are running with Spring Security Core 3.1.4.RELEASE
2013-06-27 09:51:32,357 [main           ] INFO  SecurityNamespaceHandler       - Spring Security 'config' module version is 3.1.4.RELEASE
2013-06-27 09:51:32,372 [main           ] INFO  LdapServerBeanDefinitionParser - Embedded LDAP server bean definition created for URL: ldap://127.0.0.1:389/dc=example,dc=com
2013-06-27 09:51:32,408 [main           ] DEBUG CamelNamespaceHandler          - Using org.apache.camel.spring.CamelContextFactoryBean as CamelContextBeanDefinitionParser
2013-06-27 09:51:32,975 [main           ] DEBUG CamelNamespaceHandler          - Registered default: org.apache.camel.spring.CamelProducerTemplateFactoryBean with id: template on camel context: camel-1
2013-06-27 09:51:32,975 [main           ] DEBUG CamelNamespaceHandler          - Registered default: org.apache.camel.spring.CamelConsumerTemplateFactoryBean with id: consumerTemplate on camel context: camel-1
2013-06-27 09:51:32,984 [main           ] INFO  GenericApplicationContext      - Refreshing org.springframework.context.support.GenericApplicationContext@7f56b6b9: startup date [Thu Jun 27 09:51:32 CEST 2013]; root of context hierarchy
2013-06-27 09:51:33,059 [main           ] INFO  DefaultListableBeanFactory     - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7619ed7e: defining beans [org.springframework.security.apacheDirectoryServerContainer,org.springframework.security.securityContextSource,ldapserver,template,consumerTemplate,camel-1:beanPostProcessor,camel-1,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
2013-06-27 09:51:33,319 [main           ] INFO  ApacheDSContainer              - Setting working directory for LDAP_PROVIDER: C:\Users\MYUSERNAME\AppData\Local\Temp\apacheds-spring-security-8794490705744
2013-06-27 09:51:33,382 [main           ] INFO  ApacheDSContainer              - Starting directory server...
2013-06-27 09:51:33,382 [main           ] WARN  DefaultDirectoryService        - ApacheDS shutdown hook has NOT been registered with the runtime.  This default setting for standalone operation has been overriden.
2013-06-27 09:51:34,002 [main           ] ERROR DefaultAttributeTypeRegistry   - attributeType w/ OID 2.5.4.16 not registered!
2013-06-27 09:51:34,451 [main           ] INFO  TlsKeyGenerator                - Keys and self signed certificate successfully generated.
2013-06-27 09:51:34,615 [main           ] INFO  LdapServer                     - Successful bind of an LDAP Service (389) is completed.
2013-06-27 09:51:34,615 [main           ] INFO  LdapServer                     - Ldap service started.
2013-06-27 09:51:34,624 [main           ] INFO  ApacheDSContainer              - Loading LDIF file: D:\projekte\ESB\esb-webservice-gateway\target\test-classes\apache-ds-tutorial.ldif
2013-06-27 09:51:34,632 [main           ] INFO  LdifFileLoader                 - Could not create entry ClientEntry
    dn: ou=people,o=sevenSeas
    objectclass: organizationalUnit
    objectclass: top
    ou: people
    description: Contains entries which describe persons (seamen)

org.apache.directory.shared.ldap.exception.LdapNameNotFoundException:  Cannot find a partition for 2.5.4.11=people,2.5.4.10=sevenseas

我的骆驼上下文 xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:cxf="http://camel.apache.org/schema/cxf"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd
       http://camel.apache.org/schema/cxf
       http://camel.apache.org/schema/cxf/camel-cxf.xsd">

    <security:ldap-server root="dc=example,dc=com" port="389" ldif="classpath:apache-ds-tutorial.ldif" />

    <!-- ldap settings -->
    <bean id="ldapserver" class="javax.naming.directory.InitialDirContext" scope="prototype">
        <constructor-arg>
            <props>
                <prop key="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</prop>
                <prop key="java.naming.provider.url">ldap://127.0.0.1:389</prop>
                <prop key="java.naming.security.authentication">none</prop>
                <!--
                <prop key="java.naming.referral">ignore</prop>
                <prop key="java.naming.security.principal">admin</prop>
                <prop key="java.naming.security.credentials">admin</prop>
                -->
            </props>
        </constructor-arg>
    </bean>

    <!-- this is the Camel route which proxies the real web service and forwards
        SOAP requests to it -->
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:start" />
            <to uri="bean:ldapserver?method=doLookup('${body}')" />
            <to uri="mock:result" />
        </route>
    </camelContext>
</beans>

我的问题

我必须自动创建分区吗?如果是,我该如何使用<security:ldap-server ... />? 没有看起来正确的属性,所以我想我必须@Before在包含测试的 junit 类中做一些事情。

更新 1:通过在 Spring 安全配置中从我的 LDIF 文件中指定根 dn,我设法更进一步:

<security:ldap-server root="ou=people,o=sevenSeas" port="389" ldif="classpath:apache-ds-tutorial.ldif" />

之后,我从 LDIF 文件中删除了与ou=people,o=sevenSeas. 现在我看到以下日志消息:

2013-06-27 11:04:30,193 [main           ] INFO  ApacheDSContainer              - Starting directory server...
2013-06-27 11:04:30,193 [main           ] WARN  DefaultDirectoryService        - ApacheDS shutdown hook has NOT been registered with the runtime.  This default setting for standalone operation has been overriden.
2013-06-27 11:04:30,816 [main           ] ERROR DefaultAttributeTypeRegistry   - attributeType w/ OID 2.5.4.16 not registered!
2013-06-27 11:04:31,252 [main           ] INFO  TlsKeyGenerator                - Keys and self signed certificate successfully generated.
2013-06-27 11:04:31,414 [main           ] INFO  LdapServer                     - Successful bind of an LDAP Service (389) is completed.
2013-06-27 11:04:31,414 [main           ] INFO  LdapServer                     - Ldap service started.
2013-06-27 11:04:31,417 [main           ] ERROR ApacheDSContainer              - Failed to create dc entry
java.lang.IllegalArgumentException: [Assertion failed] - this expression must be true
    at org.springframework.util.Assert.isTrue(Assert.java:65)
    at org.springframework.util.Assert.isTrue(Assert.java:77)
    at org.springframework.security.ldap.server.ApacheDSContainer.start(ApacheDSContainer.java:189)
    at org.springframework.security.ldap.server.ApacheDSContainer.afterPropertiesSet(ApacheDSContainer.java:130)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
    at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
    at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
2013-06-27 11:04:31,420 [main           ] INFO  ApacheDSContainer              - Loading LDIF file: D:\projekte\ESB\esb-webservice-gateway\target\test-classes\apache-ds-tutorial.ldif
2013-06-27 11:04:31,436 [main           ] INFO  LdifFileLoader                 - Created null.
2013-06-27 11:04:31,443 [main           ] INFO  LdifFileLoader                 - Created null.
2013-06-27 11:04:31,448 [main           ] INFO  LdifFileLoader                 - Created null.
2013-06-27 11:04:31,454 [main           ] INFO  LdifFileLoader                 - Created null.
2013-06-27 11:04:31,460 [main           ] INFO  LdifFileLoader                 - Created null.
2013-06-27 11:04:31,473 [main           ] INFO  ultSpringSecurityContextSource -  URL 'ldap://127.0.0.1:389/ou=people,o=sevenSeas', root DN is 'ou=people,o=sevenSeas'

版本

  • 骆驼 2.11.0
  • Spring 3.1.4.RELEASE

更新我用我的文件创建了一个要点以供参考https://gist.github.com/MoriTanosuke/5882934

4

2 回答 2

0

首先,我LdapRouteTest-context.xml犯了一个非常愚蠢的错误。我的路线定义是

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start" />
        <to uri="bean:ldapserver?method=doLookup('${body}')" />
        <to uri="mock:result" />
    </route>
</camelContext>

我将 beanldapserver称为一个简单的 bean。使用camel-ldap的正确方法是:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start" />
        <to uri="ldap:ldapserver?base=ou=people,o=sevenseas" />
        <to uri="mock:result" />
    </route>
</camelContext>

我必须使用该base=ou=people,o=sevenseas参数,否则我不会得到任何搜索结果。也许那是因为我还不了解 LDAP 搜索过滤器,或者这可能是您必须使用camel-ldap的方式。无论如何,现在我可以使用带有 LDIF 文件的嵌入式 LDAP 服务器进行集成测试。

我在https://gist.github.com/MoriTanosuke/5882934上用我的所有文件更新了要点,以供以后参考。

于 2013-06-28T07:08:43.277 回答
0

嵌入式服务器中的根条目仅限于“域”,因此您仅限于以“dc=blah,dc=blahblah”结尾的 DN。

您可以考虑使用Spring Security 的 LDAP 测试作为起点,因为它们已经启动并运行。

于 2013-06-27T18:09:54.767 回答