3

組織のLDAPサーバーに対して認証することにより、Spring 3MVCWebアプリケーションの一部を保護しようとしています。LDAPは初めてなので、学習しながら学習しています。私はここのドキュメントとここの例に従ってきましたが正しく理解できないようです。

これが私のsecurity-context.xmlです

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

    <!-- Security Configuration -->
    <s:http>
        <s:intercept-url pattern="/page/tosecure/*" access="ROLE_USER" />
        <s:http-basic />
    </s:http>

    <s:ldap-server root="dc=ldap,dc=sub,dc=myorg,dc=org" url="ldap.sub.myorg.org" port="636" />

    <s:authentication-manager>
        <s:ldap-authentication-provider user-dn-pattern="uid={0},cn=users" />
        <s:authentication-provider ref="ldapAuthProvider" />
    </s:authentication-manager>

    <bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
        <constructor-arg value="ldaps://ldap.sub.myorg.org:636/dc=ldap,dc=sub,dc=myorg,dc=org" />
    </bean>

    <bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
        <constructor-arg>
            <bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
                <constructor-arg ref="contextSource" />
                <property name="userDnPatterns">
                    <list>
                        <value>uid={0},cn=users</value>
                    </list>
                </property>
            </bean>
        </constructor-arg>
        <constructor-arg>
            <bean class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
                <constructor-arg ref="contextSource" />
                <constructor-arg value="cn=groups" />
                <property name="groupRoleAttribute" value="cn" />
            </bean>
        </constructor-arg>
    </bean>

</beans>

そして、これが私が得ているエラーです(スタックトレースにリストされている最後のいくつかの原因)

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.securityContextSource': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.ldap.DefaultSpringSecurityContextSource]: Constructor threw exception; nested exception is org.springframework.ldap.BadLdapGrammarException: Failed to parse DN; nested exception is org.springframework.ldap.core.TokenMgrError: Lexical error at line 1, column 5.  Encountered: "." (46), after : ""
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1035)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:939)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    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.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
    ... 106 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.ldap.DefaultSpringSecurityContextSource]: Constructor threw exception; nested exception is org.springframework.ldap.BadLdapGrammarException: Failed to parse DN; nested exception is org.springframework.ldap.core.TokenMgrError: Lexical error at line 1, column 5.  Encountered: "." (46), after : ""
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:121)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280)
    ... 115 more
Caused by: org.springframework.ldap.BadLdapGrammarException: Failed to parse DN; nested exception is org.springframework.ldap.core.TokenMgrError: Lexical error at line 1, column 5.  Encountered: "." (46), after : ""
    at org.springframework.ldap.core.DistinguishedName.parse(DistinguishedName.java:224)
    at org.springframework.ldap.core.DistinguishedName.<init>(DistinguishedName.java:174)
    at org.springframework.ldap.core.support.AbstractContextSource.setBase(AbstractContextSource.java:207)
    at org.springframework.security.ldap.DefaultSpringSecurityContextSource.<init>(DefaultSpringSecurityContextSource.java:67)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    ... 117 more
Caused by: org.springframework.ldap.core.TokenMgrError: Lexical error at line 1, column 5.  Encountered: "." (46), after : ""
    at org.springframework.ldap.core.DnParserImplTokenManager.getNextToken(DnParserImplTokenManager.java:678)
    at org.springframework.ldap.core.DnParserImpl.jj_consume_token(DnParserImpl.java:231)
    at org.springframework.ldap.core.DnParserImpl.SpacedEquals(DnParserImpl.java:114)
    at org.springframework.ldap.core.DnParserImpl.attributeTypeAndValue(DnParserImpl.java:94)
    at org.springframework.ldap.core.DnParserImpl.rdn(DnParserImpl.java:58)
    at org.springframework.ldap.core.DnParserImpl.dn(DnParserImpl.java:23)
    at org.springframework.ldap.core.DistinguishedName.parse(DistinguishedName.java:218)

理由はわかりませんが、contextSourceBeanのconstructor-argにリストされているURLが気に入らないようです。

また、この構成の他の部分が正しくないのではないかと疑っています。たとえば、ldap-serverタグとcontextSourceBeanで定義されたldapサーバーのURLがあります。これは不要な複製のように見えますが、例ではそのようになっています。誰かが構成をよく見て、それが正常であることを確認できますか?

さらに、必要に応じて、LDAPサーバーのレイアウトについて少し説明します。これは、少し標準的ではないように思われるためです。ユーザーのDNは、uid = {the_user_name}、cn = users、dc = ldap、dc = sub、dc = myorg、dc=orgによって作成されます。グループDNはcn={group_name}、cn = groups、dc = ldap、dc = sub、dc = myorg、dc = orgであり、グループのメンバーはmemberUid属性によって定義されます。私が読んだことから、グループは代わりにouによって定義されるべきであるため、これは非標準であると言います。しかし、うまくいけば、春のセキュリティがこの設定を処理できます。この構成は、ユーザーが属するロール(グループ)を適切にフェッチしますか?

4

1 に答える 1

1

ldap-server要素を削除してみましたか?ldap://あなたはそれを必要としないはずであり、あなたはそれを適切なURLで設定していません(それはおそらくまたはで始まるはずldaps://です)。

リンクした例では、組み込みサーバーを使用しており、同じものの名前空間とBeanの両方の構成を示しています。

group属性のデフォルトはcn。であるため、設定に適しているはずです。のJavadocはDefaultLdapAuthoritiesPopulator、それがどのように機能するかについて非常によく説明しています。

于 2012-11-30T16:45:05.643 に答える