2015-06-19 9 views
13

Konfiguruję aplikację internetową Spring Security (v4.0.1). Chcę mieć dwóch dostawców uwierzytelniania, jeden "w pamięci" do zarządzania kontem administratora i niestandardowy, który odnosi się do mojej własnej implementacji. System powinien podjąć próbę uwierzytelnienia wobec dostawcy "in-memory" przede wszystkim, a nie niestandardowego na drugim miejscu. Mój kod wygląda następująco:W pamięci i niestandardowych dostawców wszyscy razem

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception { 
    auth.inMemoryAuthentication() 
      .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN"); 
    auth.authenticationProvider(provider); 
} 

Jednak ten kod prowadzi strukturę do wypróbowania najpierw mojej niestandardowej implementacji. Ma to sens, ponieważ metoda AuthenticationManagerBuilder#authenticationProvider dodaje dostawcę do wewnętrznej listy, podczas gdy AuthenticationManagerBuilder#inMemoryAuthentication konfiguruje ją wewnętrznie. Jak mogłem sprawić, żeby działało?

Odpowiedz

20

Można tworzyć InMemoryUserDetailsManagerConfigurer ręcznie i poinformować go skonfiguruje się na AuthenticationManagerBuilder po zakończeniu konfigurowania go tak instaluje to AuthenticationProvider przed swoim zwyczajem jednym:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
     AuthenticationProvider provider) throws Exception { 

    inMemoryConfigurer() 
     .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN") 
     .and() 
     .configure(auth); 
    auth.authenticationProvider(provider); 
} 

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> 
     inMemoryConfigurer() { 
    return new InMemoryUserDetailsManagerConfigurer<>(); 
} 

Normalnie, co się dzieje, że InMemoryUserDetailsManagerConfigurer jest tworzony i dodane do listy konfiguratorów, które powinny zostać zastosowane po zbudowaniu AuthenticationManager - czyli po zainstalowaniu niestandardowego AuthenticationProvider.

+0

To zdecydowanie działa ;-) –

3

Mniej więcej od spring.io Documentation

Jeśli używasz konfiguracji XML (np wiosna-security.xml):

<security:authentication-manager> 
    <security:authentication-provider ref="FirstProvider" /> 
    <security:authentication-provider ref="SecondProvider" /> 
</security:authentication-manager> 

(używam tej konfiguracji dla jednego Wiosna wbudowanego dostawcy uwierzytelniania obok niestandardowego, działa bez zarzutu)

Jeśli korzystasz z Java Config, mogę odwoływać się tylko do postu innej osoby maclema on Java config for multiple authentication provider, ponieważ nigdy (z powodzeniem) nie próbowałem konfiguracji kodu

+0

Dzięki za odpowiedź, nie używam konfiguracji XML. To, co chcę osiągnąć, to coś podobnego do połączonej odpowiedzi, ale zamiast dwóch niestandardowych dostawców uwierzytelniania, mam niestandardowy i inny w pamięci, który jest dostarczany przez Spring. Ponieważ pamięć w pamięci zdefiniowana jest przez moduł AuthenticationManagerBuilder, nie wiem, jak go dodać. –

Powiązane problemy