2017-11-23 13 views
1

내 웹 응용 프로그램 사용자가 LDAP 및 추가 사용자 정의 인증으로 인증되기를 바랍니다. Kotlin에서 작성된 스프링 부트 응용 프로그램입니다. CustomAuthenticationProvider가 성공적으로 인증하는 경우 (기능 인증합니다 던져하지 않습니다) 그래서 인증은 LDAP 인증 공급자를 사용하여 계속 체인 내가 원하는스프링 보안 인증 성공 사례 여러

@Autowired 
lateinit var authenticationProvider: CustomAuthenticationProvider 

override fun configure(auth: AuthenticationManagerBuilder) { 
    auth 
      .authenticationProvider(authenticationProvider) 

    auth 
      .ldapAuthentication() 
       .userDnPatterns("uid={0},ou=people") 
       .groupSearchBase("ou=groups") 
       .contextSource() 
       .url("ldap://localhost:8389/dc=example,dc=com") 
      .and() 
       .passwordCompare() 
       .passwordEncoder(PlaintextPasswordEncoder()) 
       .passwordAttribute("userPassword") 
} 

인증을 다음과 같이 나는 AuthenticationManagerBuilder을 구성했습니다.

CustomAuthenticationProvider가 성공적으로 인증되면 작성된대로 LDAP 인증 (및 이후의 인증 공급자)은 평가되지 않습니다. CustomAuthenticationProvider가 throw되는 경우에만 LDAP 인증이 수행됩니다.

여러 인증 공급자를 갖지만 AND 동작보다는 OR 동작을 갖는 많은 기사 (예 : Multiple Authentication Providers in Spring Security)를 읽었습니다. 어떤 제안?

+1

어떻게 가능합니까? 인증 공급자가 인증을 제공하는 경우 LDAP 인증이 필요한 이유는 이미 인증 된 것입니다. 유일한 방법은 인증 공급자가 인증을 노출하지 않는 것입니다. 그래서 당신은 아직 인증되지 않았습니다. – dur

답변

1

어쩌면 내가 가지고 있습니다. 그러나 두포에서 무슨 일이 진행되고 있는지 분석 해보자.

스프링 보안 (ProviderManager)의 기본 인증 관리자 구현은 인증 공급자 목록을 유지 관리하고 인증을 성공적으로 수행하는 첫 번째 인증 체인은 체인을 중지하며 나머지는 호출되지 않습니다. 나는 당신이 그것을 바꿀 수 없다고 확신합니다. AuthenticationManagerBuilder을 사용하면 ProviderManager에 인증 공급자를 추가합니다. (자세한 내용은 간결하게 생략)이이처럼 보이는 소스 코드에서

Security architecture

:

무슨 일이 일어나고 있는지의 높은 수준의 개요는 아래 이미지에 표시됩니다

public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException { 
     Class<? extends Authentication> toTest = authentication.getClass(); 
     ... 
     for (AuthenticationProvider provider : getProviders()) { 
      if (!provider.supports(toTest)) { 
       continue; 
      } 

      try { 
       result = provider.authenticate(authentication); 

       if (result != null) { 
      ... 
        break; 
       } 
      } 
     ... 
      catch (AuthenticationException e) { 
       lastException = e; 
      } 
     } 

     if (result != null) { 
      ... 
      return result; 
     } 
    } 

그래서 네가 할 수있는 일은 ... 흠. 첫째로 @dur에 대한 질문은 유효합니다 :-) 둘째 - 나에게 맞는 표준 인증 관리자로 원하는 것을 할 수 없다는 것이 명백합니다.

  1. 는 필터 체인에 자신의 인증 관리자 구현을 제공 : 내가 생각하는 무엇

    는 아직도 그 길을 갈하려는 경우 두 가지를 시도 할 수 있다는 것이다. 이것은 나에게 약간 도전적인 것 같다.

  2. 사용자 지정 인증 공급자가 필요한 모든 인증 작업을 처리하는지 확인하십시오.