복붙노트

[SPRING] 스프링 보안 4.0.0 + ActiveDirectoryLdapAuthenticationProvider + BadCredentialsException PartialResultException

SPRING

스프링 보안 4.0.0 + ActiveDirectoryLdapAuthenticationProvider + BadCredentialsException PartialResultException

스택 오버 플로우시 Spring / Security / Ldap과 Active Directory에 관한 거의 모든 것을 읽었습니다. 유용한 팁과 힌트를 찾았음에도 문제를 해결할 수 없었습니다.

여기있다 : 나는 사용자 서비스와 커스텀 로그인 페이지를 사용하여 Spring Security를 ​​설정했고 모든 것이 잘 동작한다. 그런 다음 ActiveDirectory 일 수있는 최종 인증 공급자로 전환하려고했습니다.

여기에 내 security-applicationContext.xml이 있습니다 (이 설정은 인증 공급자로서 사용자 서비스와 잘 작동하므로 실제로 파일을 가져 오는 등).

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

<!-- Définitions globales de sécurité -->
<global-method-security pre-post-annotations="enabled" />

<!-- Configuration de l'accès et du formulaire -->
<!-- Permettre l'accès libre aux feuilles de style, polices et images -->
<http pattern='/resources/css/**' security="none" />
<http pattern='/resources/fonts/**' security="none" />
<http pattern='/resources/images/**' security="none" />

<http use-expressions="true" access-denied-page="/403" disable-url-rewriting="true">

    <!-- Limitation à une seule session utilisateur concurrente -->
    <session-management invalid-session-url="/identite?time=1">
        <concurrency-control max-sessions="1" expired-url="/identite?time=1" />
    </session-management>

    <!-- Définitions pour le formulaire de la page JSP d'identification -->
    <form-login login-page="/identite" login-processing-url="/identite.proc" default-target-url="/" always-use-default-target="true" authentication-failure-url="/identite?err=1" username-parameter="username" password-parameter="password" />

    <logout logout-url="/logout" logout-success-url="/identite?out=1" delete-cookies="JSESSIONID" invalidate-session="true" />

    <!-- Utiliser un canal chiffré pour les échanges -->
    <intercept-url requires-channel="https" pattern="/identite*" access="permitAll()" />
    <intercept-url requires-channel="https" pattern="/**" access="isAuthenticated()" />
</http>

<!-- Fournisseurs d'identité pour le formulaire (au final, LDAP) -->
<authentication-manager erase-credentials="true">
    <ldap-authentication-provider ref="myADProvider" />
    <!-- This is the user-service authentication provider that is working fine
        <authentication-provider>
        <user-service>
        <user name="Toto" authorities="ROLE_USER, ROLE_ADMIN" password="totototo" />
        </user-service>
        </authentication-provider>
    -->
</authentication-manager>

<b:bean id="myADProvider"
    class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <b:constructor-arg value="fsappsuni" />
    <b:constructor-arg value="ldap://fsapps.company.uni:389/" />
    <b:property name="convertSubErrorCodesToExceptions" value="true" />
    <b:property name="useAuthenticationRequestCredentials" value="true" />
</b:bean>

bean myADProvider에서 fsapps.company.uni 또는 company.uni에 대한 첫 번째 생성자 인수를 변경하더라도 다음 오류는 변경되지 않습니다. 문제는 바인딩을 검색 한 후 잘못된 필터 (예 : & (userPrincipalName = {0}) (objectClass = user)) 대신 (& sAMAccountName = {0}) (objectClass = 사용자)). LDAP 공급자를 사용하여이 작업을 수행하는 동안이 작업을 변경하는 방법을 파악할 수 없었기 때문에 LDAP 공급자로 전환하여 성공하지 않고 같은 위치에서 문제가 발생하지 않도록했습니다. 또한 Spring Framework를 3.1.2에서 4.1.6으로 업그레이드했습니다 .RELEASE 및 Spring Security는 3.1.2에서 4.0.0으로 릴리즈되었습니다. 그 동안 문제가 해결되기를 바라는 ActiveDirectoryLdapAuthenticationProvider에 대한 문제가있었습니다. 이 문제에 대한 원래 토론은 버전 3.x와 관련이 있습니다.

다음은 Active Directory에서 인증 작업을 수행하려는 LDAP 설정에 대한 구성입니다.

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

<!-- Définitions globales de sécurité -->
<global-method-security pre-post-annotations="enabled" />

<!-- Configuration de l'accès et du formulaire -->
<!-- Permettre l'accès libre aux feuilles de style, polices et images -->
<http pattern='/resources/css/**' security="none" />
<http pattern='/resources/fonts/**' security="none" />
<http pattern='/resources/images/**' security="none" />

<http use-expressions="true" disable-url-rewriting="true">

    <!-- Limitation à une seule session utilisateur concurrente -->
    <session-management invalid-session-url="/identite?time=1">
        <concurrency-control max-sessions="1" expired-url="/identite?time=1" />
    </session-management>

    <!-- Définitions pour le formulaire de la page JSP d'identification -->
    <form-login login-page="/identite" login-processing-url="/identite.proc" default-target-url="/" always-use-default-target="true" authentication-failure-url="/identite?err=1" username-parameter="username" password-parameter="password" />
    <csrf disabled="true" />

    <logout logout-url="/logout" logout-success-url="/identite?out=1" delete-cookies="JSESSIONID" invalidate-session="true" />

    <!-- Utiliser un canal chiffré pour les échanges -->
    <intercept-url requires-channel="https" pattern="/identite*" access="permitAll()" />
    <intercept-url requires-channel="https" pattern="/**" access="isAuthenticated()" />
</http>

<!-- Fournisseurs d'identité pour le formulaire (au final, LDAP) -->
<ldap-server url="ldap://fsapps.company.uni/dc=fsapps,dc=company,dc=uni" port="389" />
<authentication-manager erase-credentials="true">
    <ldap-authentication-provider role-prefix="none"
        user-search-filter="(&amp;(sAMAccountName={0})(objectClass=user))"
        group-search-filter="(&amp;(member={0})(objectClass=group))"
        user-search-base="dc=fsapps,dc=company,dc=uni">
    </ldap-authentication-provider>
    <!-- <authentication-provider ref="myADProvider" ></authentication-provider> -->
</authentication-manager>

<!--
<b:bean id="myADProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <b:constructor-arg value="fsapps.company.uni" />
    <b:constructor-arg value="ldap://fsapps.company.uni:389/" />
    <b:property name="convertSubErrorCodesToExceptions" value="true" />
    <!- -
    <b:property name="useAuthenticationRequestCredentials" value="true" />
    - ->
</b:bean>
<b:bean id="webSecurityExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"></b:bean>
-->

</b:beans>

이번에는 참조 용으로 AD 제공자에게 빈 설정 부분을 맡겼다. 이것은 둘 다 작동하지 않습니다.

그렇다면 어떻게 사용자 및 그룹 검색 경로를 AD 제공자에게 전달할 수 있습니까? 또는 AD와 함께 작동하고 인증을 완료하도록 LDAP 공급자를 구성하려면 어떻게해야합니까?

다음은 LDAP 설정으로 내 로그에서받은 메시지입니다. AD 설정은 위에서 설명한 것입니다 (잘못된 검색 경로로 인해 잘못된 자격 증명이 있음).

2015-04-15 16:19:13,252 DEBUG (o.s.s.a.ProviderManager.authenticate) [http-8443-1] Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider MDC{}
2015-04-15 16:19:13,252 DEBUG (o.s.s.l.a.AbstractLdapAuthenticationProvider.authenticate) [http-8443-1] Processing authentication request for user: ba5glag MDC{}
2015-04-15 16:19:13,252 DEBUG (o.s.s.l.s.FilterBasedLdapUserSearch.searchForUser) [http-8443-1] Searching for user 'myuser', with user search [ searchFilter: '(&(sAMAccountName={0})(objectClass=user))', searchBase: 'dc=fsapps,dc=company,dc=uni', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ] MDC{}
2015-04-15 16:19:13,299 DEBUG (o.s.s.a.DefaultAuthenticationEventPublisher.publishAuthenticationFailure) [http-8443-1] No event was found for the exception org.springframework.security.authentication.InternalAuthenticationServiceException MDC{}
2015-04-15 16:19:13,299 ERROR (o.s.s.w.a.AbstractAuthenticationProcessingFilter.doFilter) [http-8443-1] An internal error occurred while trying to authenticate the user. MDC{}
org.springframework.security.authentication.InternalAuthenticationServiceException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 00000000: LdapErr: DSID-0C090627, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece(unprintable character here)]; remaining name 'dc=fsapps,dc=company,dc=uni'
        at org.springframework.security.ldap.authentication.LdapAuthenticationProvider.doAuthentication(LdapAuthenticationProvider.java:207) ~[spring-security-ldap-4.0.0.RELEASE.jar:?]
        at org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider.authenticate(AbstractLdapAuthenticationProvider.java:82) ~[spring-security-ldap-4.0.0.RELEASE.jar:?]

누군가가이 구성 문제를 해결하기위한 몇 가지 힌트와 지침을 제공하기 위해 필요한 모든 정보를 제공하기를 바랍니다.

ActiveDirectoryLdapAuthenticationProvider와 함께 검색 필터를 추가하는 방법을 알아 냈습니다. 또한 Wireshark를 통해 내 응용 프로그램 서버와 AD 서버 간의 교환을 통해 실제로 수행 된 작업을 확인했습니다. 여기에 내 연구 결과가있다. 나는 내 문제에 대한 해결책이 아니라고 생각한다. 내가 업데이트 한 security-applicationContext.xml은 ActiveDirectoryLdapAuthenticationProvider를 작동하도록 집중 한 이래로 LDAP 서버를 폐기했습니다. 이제는 더 깨끗한 구성으로 읽을 수 있습니다.

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

    <!-- Définitions globales de sécurité -->
    <global-method-security pre-post-annotations="enabled" />

    <!-- Configuration de l'accès et du formulaire -->
    <!-- Permettre l'accès libre aux feuilles de style, polices et images -->
    <http pattern='/resources/css/**' security="none" />
    <http pattern='/resources/fonts/**' security="none" />
    <http pattern='/resources/images/**' security="none" />
    <http pattern='/resources/js/**' security="none" />

    <http use-expressions="true" disable-url-rewriting="true">

        <!-- Limitation à une seule session utilisateur concurrente -->
        <session-management invalid-session-url="/identite?expiree=1">
            <concurrency-control max-sessions="1" expired-url="/identite?expiree=1" />
        </session-management>

        <!-- Définitions pour le formulaire de la page JSP d'identification -->
        <form-login login-page="/identite" login-processing-url="/identite.proc" default-target-url="/" always-use-default-target="true" authentication-failure-url="/identite?err=1" username-parameter="username" password-parameter="password" />
        <csrf disabled="true" />

        <logout logout-url="/logout" logout-success-url="/identite?termine=1" delete-cookies="JSESSIONID" invalidate-session="true" />

        <!-- Utiliser un canal chiffré pour les échanges -->
        <intercept-url requires-channel="https" pattern="/identite*" access="permitAll()" />
        <intercept-url requires-channel="https" pattern="/**" access="isAuthenticated()" />
        <access-denied-handler error-page="/erreur403" />
    </http>

    <!-- Fournisseurs d'identité pour le formulaire (au final, LDAP) -->
    <authentication-manager erase-credentials="true">
         <authentication-provider ref="myADProvider" />
    </authentication-manager>

    <b:bean id="myADProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
        <b:constructor-arg value="fsapps.company.uni" />
        <b:constructor-arg value="ldap://fsapps.company.uni:389/" />
        <b:property name="searchFilter" value="(&amp;(sAMAccountName={0})(objectClass=user))" />
        <b:property name="convertSubErrorCodesToExceptions" value="true" />
        <b:property name="useAuthenticationRequestCredentials" value="true" />
    </b:bean>
    <b:bean id="webSecurityExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

</b:beans>

구성에 대한 의견은 거의 없습니다. myADProvider bean 정의에서 생성자의 첫 번째 인수 인 fsapps.company.uni는 username@fsapps.company.uni 형식으로 프린시 펄을 작성하고 양식의 baseObject로 검색 요청에 대한 baseObject를 빌드하는 데 사용됩니다. dc = fsapps, dc = company, dc = uni.

두 번째 생성자의 인수는 통신을 설정하는 데 사용됩니다. name = "searchFilter"인 속성 유형의 다음 요소는 검색 필터를 설정하기 위해 ActiveDirectoryLdapAuthenticationProvider 클래스의 setSearchFilter () 메서드를 호출합니다.이 필터는 원래 진전을 모색하고있었습니다. 이제 검색이 설정됩니다 (& (sAMAccountName = {0}) (objectClass = user)).

이 설정으로 WireShark에서 LDAP 대화를 볼 수 있으며 바인딩이 성공합니다. 바인드 응답은 성공입니다. 그런 다음 검색 요청도 성공하지만 결과를 반환하지 않습니다. 그러므로 나는 아직도 내 기록에서 다음과 같은 것을 얻고있다.

2015-04-16 10:30:28,201 DEBUG (o.s.s.a.ProviderManager.authenticate) [http-8443-2] Authentication attempt using org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider MDC{}
2015-04-16 10:30:28,201 DEBUG (o.s.s.l.a.AbstractLdapAuthenticationProvider.authenticate) [http-8443-2] Processing authentication request for user: myusername MDC{}
2015-04-16 10:30:28,294 DEBUG (o.s.s.l.SpringSecurityLdapTemplate.searchForSingleEntryInternal) [http-8443-2] Searching for entry under DN '', base = 'dc=fsapps,dc=company,dc=uni', filter = '(&(sAMAccountName={0})(objectClass=user))' MDC{}
2015-04-16 10:30:28,294 INFO (o.s.s.l.SpringSecurityLdapTemplate.searchForSingleEntryInternal) [http-8443-2] Ignoring PartialResultException MDC{}
2015-04-16 10:30:28,310 DEBUG (o.s.s.w.a.AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication) [http-8443-2] Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials MDC{}
2015-04-16 10:30:28,310 DEBUG (o.s.s.w.a.AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication) [http-8443-2] Updated SecurityContextHolder to contain null Authentication MDC{}
2015-04-16 10:30:28,310 DEBUG (o.s.s.w.a.AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication) [http-8443-2] Delegating to authentication failure handler org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler@2876b359 MDC{}

나는 거의 거기에 있다고 믿지만 누군가가 어떤 것을 제공 할 수 있다면 여전히 약간의 도움을 사용할 수 있습니다. 면밀한 조사 후에는 baseObject를 생성하는 데 사용되는 첫 번째 생성자의 인수가 표시되고 userPrincipalName이 내 문제입니다. 설정에서 userPrincipalName은 LDAP url의 도메인 이름이 아닌 도메인 이름 (예 : campus.company.com)을 사용하고 있습니다. 지금까지는 그렇게 좋았으나 사용자의 주체를 구성하는 데 사용 된 도메인 이름과 일치하도록 인수를 변경할 수 있습니다. 이제 문제는 LDAP URL 스키마 (예 : fsapps.company.uni)와 일치해야하는 baseObject가 변경된다는 것입니다.

문서에서 검색 필터를 설정하는 방법은 하나 뿐이지 만 생성자는 하나, 둘 또는 세 개의 인수를 사용할 수 있습니다. 세 번째 인수는 baseObject 값을 제공합니다.

내 문제는 그때 내가 사용할 수있는 모든 setter 및 생성자의 인수를 작동하도록 만드는 다음 구성에 의해 해결됩니다. myADProvider bean 정의는 다음과 같습니다.

    <b:bean id="myADProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
        <b:constructor-arg value="campus.company.com" />
        <b:constructor-arg value="ldap://fsapps.company.uni:389/" />
        <b:constructor-arg value="dc=fsapps,dc=company,dc=uni" />
        <b:property name="searchFilter" value="(&amp;(userPrincipalName={0})(objectClass=user))" />
        <b:property name="convertSubErrorCodesToExceptions" value="true" />
    </b:bean>

필자의 경우 searchFilter 속성은 기본값으로 대체되었으므로 생략되었을 수 있습니다. 내 설치 및 문제에 대한이 매우 긴 설명에도 불구하고. 다른 사람이 그 혜택을 볼 수 있기를 바랍니다.

다음은 ActiveDirectorLdapAuthenticationProvider 클래스 문서에 대한 링크입니다. http://docs.spring.io/autorepo/docs/spring-security/4.0.0.RELEASE/apidocs/org/springframework/security/ldap/authentication/ad/ActiveDirectoryLdapAuthenticationProvider. HTML

와이어 셔크 (WireShark)가이 문제를 디버그하기 위해 애플리케이션 서버와 AD 서버 사이에서 무슨 일이 일어나고 있는지를 알면 매우 유용합니다.

해결법

  1. ==============================

    1.Context.REFERRAL = "follow"를 사용하여이 문제를 해결할 수 없었습니다. 사실 문제는 ActiveDirectoryLdapProvider 클래스의 searchForUser () 메소드 코드에 있습니다. 이 메서드에서 SpringSecurityLdapTemplate.searchForSingleEntryInternal () 메서드는 실제로 bindPrincipal을 사용하여 호출됩니다.이 메서드는 사실 첫 번째 인수의 생성자에 전달 된 인수와 사용자 이름으로 구성된 userPrincipalName입니다. 따라서 검색 필터를 userPrincipalName이 아닌 다른 것으로 설정하더라도 userPrincipalName이 인수 0으로 전달됩니다. 따라서 sAMAccountName이있는 필터는 UPN과 함께 작동하지 않고 예외를 throw합니다.

    Context.REFERRAL = "follow"를 사용하여이 문제를 해결할 수 없었습니다. 사실 문제는 ActiveDirectoryLdapProvider 클래스의 searchForUser () 메소드 코드에 있습니다. 이 메서드에서 SpringSecurityLdapTemplate.searchForSingleEntryInternal () 메서드는 실제로 bindPrincipal을 사용하여 호출됩니다.이 메서드는 사실 첫 번째 인수의 생성자에 전달 된 인수와 사용자 이름으로 구성된 userPrincipalName입니다. 따라서 검색 필터를 userPrincipalName이 아닌 다른 것으로 설정하더라도 userPrincipalName이 인수 0으로 전달됩니다. 따라서 sAMAccountName이있는 필터는 UPN과 함께 작동하지 않고 예외를 throw합니다.

    searchFilter가 UPN이 아닌 사용자 이름이 필요하다는 것을 감지하기 위해 searchForUser ()를 수정하거나 보강해야하며, searchFilter에 대한 패턴을 사용하여 인수를 설정하는 추가 설정자가 제공됩니다.

    그러나 코드를 수정하지 않고 이러한 상황에서이 클래스를 올바르게 작동하게하는 방법은 없습니다. 그것이 내가 마침내 한 일입니다. 내 자신의 클래스를 기본적으로 원래 ActiveDirectoryLdapAUthenticationProvider의 카본 복사본으로 searchForSingleEntryInternal ()에 bindPrincipal 대신 사용자 이름을 전달하는 searchForUser ()에 대한 단일 한 수정으로 작성했습니다.

    그것은 약간의 말도 안되는 당신이 원하는 검색 필터를 입력 할 수 있지만 실제로는 userPrincipalName 및 아무것도 다른 하나의 인수를 사용하도록 강제.

  2. ==============================

    2.나는 유사한 문제에 빠져서 일종의 연구를했다. 도메인 "my.company.com"을 가진 광고에서 우리는 두 세트의 사용자를 갖고있는 것으로 보였습니다. 하나는 UPN을 user1@my.company.com 형식으로 설정하고 다른 경우는 user2 @ somethingelse 형식으로 설정했습니다. com.

    나는 유사한 문제에 빠져서 일종의 연구를했다. 도메인 "my.company.com"을 가진 광고에서 우리는 두 세트의 사용자를 갖고있는 것으로 보였습니다. 하나는 UPN을 user1@my.company.com 형식으로 설정하고 다른 경우는 user2 @ somethingelse 형식으로 설정했습니다. com.

    그리고 org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider를 사용하고 user1@my.company.com 및 user2@somethingelse.com으로 사용자를 인증하려고하면 그 중 하나만 생성자에 전달하는 것에 따라 작동합니다 도메인 이름.

    나는 광고 전문가가 아니지만 Microsoft Tech net article : https://technet.microsoft.com/en-us/library/cc739093(v=ws.10).aspx에서 보면 UPN 접미사는 일반적으로 다음과 같은 것처럼 보입니다. 도메인 이름, 그것은 필수 사항이 아니며 다른 접미사가 붙을 수 있습니다. 그 기사를 인용하기.

    하지만 ActiveDirectoryLdapAuthenticationProvider.java는 UPN 접미사와 도메인 이름이 같다고 가정합니다. 그 가정을하지 않기 위해 ActiveDirectoryLdapAuthenticationProvider.java에 대한 로컬 픽스를 만들었습니다 :

    String createBindPrincipal(String username) {
        if (domain == null || username.toLowerCase().endsWith(domain) || username.contains("@")) {
                return username;
        }
        return username + "@" + domain;
    }
    

    이제 서로 다른 UPN 접미사를 가진 두 사용자를 모두 검색 할 수 있습니다. 내 가정이 정확하다면, 스프링 보안으로 버그를 열 수 있습니다.

  3. ==============================

    3.Spring Security 4.1.1 / Spring Boot 1.4.0 환경에서는 다음과 같이 (Java에서) 이렇게합니다.

    Spring Security 4.1.1 / Spring Boot 1.4.0 환경에서는 다음과 같이 (Java에서) 이렇게합니다.

    @Configuration
    public class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter
    {
       public void init (AuthenticationManagerBuilder aAuth) throws Exception
       {
    
          ActiveDirectoryLdapAuthenticationProvider
                  myProvider = new ActiveDirectoryLdapAuthenticationProvider (ldapDomain, ldapUrl);
          aAuth.authenticationProvider (myProvider);
          aAuth.eraseCredentials (false);
       }
    }
    

    어떤 문제도 발생하지 않으며 사용자는 sAMAccountName을 사용하여 로그온 할 수 있습니다.

  4. from https://stackoverflow.com/questions/29658844/spring-security-4-0-0-activedirectoryldapauthenticationprovider-badcredentia by cc-by-sa and MIT license