2014-12-19 4 views
4

Я хотел бы использовать весеннюю безопасность в приложении весеннего mvc, которое состоит из двух модулей - «frontend» и модуля управления. Оба модуля имеют свой собственный диспетчерский сервлет (с разными сопоставлениями), поэтому у них есть свой собственный веб-контекст, но они имеют один и тот же корневой контекст.Как настроить весеннюю безопасность для нескольких сервлетов?

Модуль управления имеет свою собственную базу данных аутентификации, и пользователи должны иметь возможность входа в модуль «frontend» и управления одновременно с разными учетными данными. Поэтому я реализовал две разные версии: UserDetailsService.

Мне нужно два разных AuthenticationManager, где оба ответственны за разные URL-адреса, соответствующие отображениям сервлетов.

Как настроить такую ​​настройку? Возможно ли использование java config?

Редактировать: до сих пор у меня есть следующая конфигурация, которая позволяет мне авторизовать пользователей для модуля управления. Аутентификация/авторизация модулей «frontend» с использованием автообновленного frontendUserDetailsService по-прежнему отсутствует.

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private PasswordEncoder passwordEncoder; 
    @Autowired 
    @Qualifier("frontend") 
    private UserDetailsService frontendUserDetailsService; 
    @Autowired 
    @Qualifier("management") 
    private UserDetailsService managementUserDetailsService; 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .userDetailsService(managementUserDetailsService) 
       .passwordEncoder(passwordEncoder); 
    } 

    @Bean 
    @Qualifier("management") 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatcher("/manage/**") 
      .authorizeRequests() 
       .anyRequest() 
       .hasRole("ADMIN") 
       .and() 
      .formLogin(); 
    } 
} 
+0

Вы читали [документацию] (http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/ htmlsingle/# множественного httpsecurity)? –

+0

Да, но это помогло мне настроить несколько экземпляров 'HttpSecurity'. Но это не позволяет мне настраивать разные 'AuthenticationManager'. Я просто просматриваю источник весенней безопасности и считаю, что можно было бы переопределить поведение по умолчанию для создания «AuthenticationManager», но до сих пор я не нашел чистого решения (должен работать над переопределением «WebSecurityConfigurerAdapter # authenticationManager» и используйте множественный подход «HttpSecurity» выше). –

+0

Да, это так, как вы можете также переопределить метод configure, который позволяет настроить диспетчер проверки подлинности. –

ответ

5

Вы должны создать конфигурацию, которая делает несколько вещей

  1. Включить безопасность
  2. Включить защиту для фронтэнда
  3. Включить защиту для внутреннего интерфейса

В основном те, являются 3 различными частями конфигурации, для которых все требуются соответствующие классы @Configuration ,

Что-то вроде следующего должно работать.

@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfig { 

    @Configuration 
    @Order(1) 
    public static class FrontEndSecurityConfiguration extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private PasswordEncoder passwordEncoder; 

     @Autowired 
     @Qualifier("frontend") 
     private UserDetailsService frontendUserDetailsService; 

     @Override 
     public void configure(AuthenticationManagerBuilder auth) throws Exception { 
      auth 
       .userDetailsService(frontendUserDetailsService) 
        .passwordEncoder(passwordEncoder); 
     } 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .antMatcher("/frontend/**") 
       .authorizeRequests() 
        .anyRequest() 
        .hasRole("USER") 
        .and() 
       .formLogin(); 
     } 
    } 

    @Configuration 
    @Order(2) 
    public static class BackendSecurityConfiguration extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private PasswordEncoder passwordEncoder; 

     @Autowired 
     @Qualifier("management") 
     private UserDetailsService managementUserDetailsService; 

     @Override 
     public void configure(AuthenticationManagerBuilder auth) throws Exception { 
      auth 
       .userDetailsService(managementUserDetailsService) 
        .passwordEncoder(passwordEncoder); 
     } 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .antMatcher("/manage/**") 
       .authorizeRequests() 
        .anyRequest() 
        .hasRole("ADMIN") 
        .and() 
       .formLogin(); 
     } 
    } 
} 

Вы, вероятно, нужно настроить

+1

Спасибо за ваши головы. Я был очень близок к этому решению, но не понял, что 'configure (AuthenticationManagerBuilder)' получает экземпляр _local_, а не глобальный 'AuthenticationManagerBuilder'. Как только я проведу эту настройку, я приму ваш ответ. Спасибо! –

+0

@ChristianRudolph, пожалуйста, объясните мне, как вы это поняли. У меня такая же проблема, но я не могу ее решить. – Yuriy

+0

Я сделал это точно так, как было предложено в этом ответе, - используя вложенные классы конфигурации, которые обеспечивают конфигурацию весенней безопасности. –

Смежные вопросы