2013-04-29 3 views
1

내가 LDAP를 사용하여 인증하고 함께 도메인 이름에 대한 프롬프트를 봄 보안을 구성 할 수 있으며 모든 특정 도메인 내에서 사용자를 위해 잘 작동합니다. 하지만 두 번째 도메인에 속한 사용자를 인증하는 방법을 이해하는 데 어려움을 겪고 있습니다. 아래에 표시된 나의 현재 구성은 사용자 검색 기반의 첫 번째 도메인을 지정합니다. 이 매개 변수를 제거하여 모든 도메인을 검색하기를 원했지만 작동하지 않았습니다. domain \ user와 같이 프롬프트가 표시되면 사용자 이름의 일부로 도메인을 지정하려고 시도했지만이 방법도 작동하지 않았습니다.나는 사용자 이름과 암호

<security:authentication-manager alias="authenticationManager"> 
     <security:ldap-authentication-provider 
      user-search-filter="(samaccountname={0})" 
      user-search-base="dc=domain,dc=company,dc=com" 
      user-context-mapper-ref="userContextMapper" > 
     </security:ldap-authentication-provider> 
</security:authentication-manager> 

<security:ldap-server 
    url="ldap://some.url.com:3000" 
    manager-dn="CN=USER1,OU=FacMgr,OU=FAC,OU=Exchange,dc=domain,dc=company,dc=com" 
    manager-password="xxxx"/> 

나는 사용자 정의 검색을 만들어야합니다, 그렇다면, 누군가가이 상황에서 예를 제공 할 수 있습니까? 당신이 더 기본적인 ActiveDirectoryLdapAuthenticationProvider 클래스를 사용하지 않는 이유를 궁금해하는 경우 Active Directory를 사용하고 있습니다 것처럼

답변

0

이 나타납니다.

어쨌든 LdapAuthenticationProvider 또는 ActiveDirectoryLdapAuthenticationProvider를 확장하고 해당 도메인을 수퍼 클래스의 메서드로 전달하여 필요한 것을 수행 할 수 있어야합니다.

두 개의 서로 다른 LdapAuthenticator 개체를 허용하는 생성자를 만들고 doAuthentication 메서드의 catch (UsernameNotFoundException notFound) 문 (잘못된 자격 증명을 확인한 후)에 두 번째 'try'문을 추가합니다. getAuthenticator 메서드를 사용하여 첫 번째 인증자가 실패 할 경우 두 번째 인증자를 시도하는 방법을 사용하십시오.

이 방법은 작업을해야

하지만 두 도메인이 jsmith의 이름을 가지고 있지만, 해당 사용자가 두 번째에있는 경우 문제가 발생할 수 있습니다 - 즉, 이것은 특히 좋은 솔루션은 아니지만, 용액이다.

이 모든 것을 올바르게 구성하려면 사용자 지정 인증 필터 (UsernamePasswordAuthenticationFilter 확장)를 사용하고 LdapAuthenticationProvider.getAuthenticator() 메서드가 사용자 지정 로그인 폼에서 필터가 전달한 값에서 도메인을 식별하도록합니다.

서로 다른 관리자 계정을해야 할 수도 있습니다,하지만 당신이 갈이 잘하면 충분하다.

+0

, 나는 걸쳐 일어난 [이 보석] (http://www.coderanch.com/t/485524/Spring/SpEL)를 보면서 SpEL 표현식에 동적 필드를 삽입하는 방법입니다. 보기에 보면 두 개의 서로 다른 LDAP 빈을'ldap.xml' 설정 파일에 넣고 도메인 입력을 기반으로 관련 빈을 참조 할 수 있어야합니다 (즉, 로그인 요청을 가로 채서 전달하는 컨트롤러를 통해) 동적으로) 주석을 통해.특히, 참조가'TaxRuleProcessor' 오브젝트를 나열하는 주석을 찾으십시오. 꽤 매끄럽다. – cabbagery

0

이 작품을 만들기 위해 트릭은 ActiveDirectoryLdapAuthenticationProvider를 사용하는 것입니다. resources.groovy에서

: Config.groovy 파일에서

// Domain 1 
ldapAuthProvider1(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain.com", 
     "ldap://mydomain.com/" 
) 

// Domain 2 
ldapAuthProvider2(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain2.com", 
     "ldap://mydomain2.com/" 
) 

이렇게하려면, 단지 다음과 같이 변경합니다

grails.plugin.springsecurity.providerNames = ['ldapAuthProvider1', 'ldapAuthProvider2'] 

이 필요한 모든 코드입니다. Config.groovy의 다른 grails.plugin.springsecurity.ldap. * 설정은이 AD 설정에 적용되지 않기 때문에 거의 모두 제거 할 수 있습니다.

문서 : 아직 문제가 해결되지 않은 경우 http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ldap-active-directory

관련 문제