2016-09-19 4 views
1
@EnableWebSecurity 
public class MultiHttpSecurityConfig { 

@Configuration 
@Order(1) 
public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable().authorizeRequests() 
     .antMatchers("/my/**", "/account/**").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") 
     .and().formLogin().loginPage("/login"); 
    } 
} 

@Configuration 
@Order(2) 
public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable().authorizeRequests() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .and().formLogin().loginPage("/adminlogin"); 
    } 
} 
} 

Предполагается, что это две разные формы входа. Моя проблема в том, что тот, у кого высший порядок/adminlogin не отображается. У меня есть идея, почему? Пожалуйста помоги. Код от Spring boot - how to configure multiple login pages?Весна и весна безопасность несколько страниц входа

По предложению Софии я попытался это:

@Configuration 
@Order(2) 
public static class UserConfigurationAdapter extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
     .requestMatcher(new AntPathRequestMatcher("/my/**")) 
     .csrf().disable()  
     .authorizeRequests().antMatchers("/my/**").access("hasRole('ROLE_USER')") 
     .and().formLogin().loginPage("/login"); 
    } 
} 

@Configuration 
@Order(1) 
public static class AdminConfigurationAdapter extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
     .requestMatcher(new AntPathRequestMatcher("/admin/**")) 
     .csrf().disable()  
     .authorizeRequests().antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .and().formLogin().loginPage("/adminlogin"); 
    } 
} 

Но в обоих случаях/Логин называется

+0

Когда я вхожу в пример http://docs.spring.io/spring- security/site/docs/current/reference/html/jc.html # multiple-httpsecurity Я получаю это исключение: java.lang.IllegalStateException: @Order на WebSecurityConfigurers должны быть уникальными. Заказ 100 был уже использован на ... FormLoginWebSecurityConfigurerAdapter ... – ropo

ответ

2

Я считаю, что причина, почему ваш администратор Логин не активируя потому, что: во-первых, он НЕ выше в приоритете.

@Order определяет порядок сортировки для аннотированного компонента. Значение является необязательным и представляет собой величину заказа, определенную в интерфейсе Ordered. Нижние значения имеют более высокий приоритет. Значением по умолчанию является Ordered.LOWEST_PRECEDENCE, что указывает на самый низкий приоритет (проигрывание любого другого указанного значения заказа).

Во-вторых, согласно Javadoc HttpSecurity «s:

HttpSecurity похож на элемент XML Spring Security в конфигурации пространства имен. Он позволяет настраивать веб-безопасность для определенных HTTP-запросов. По умолчанию он будет применяться ко всем запросам, но может быть ограничен с помощью requestMatcher (RequestMatcher) или других подобных методов.

Так что попробуйте ограничивая объект HttpSecurity, чтобы активировать для администратора страниц, первой настройке requestMatcher, что:

http 
     .requestMatcher(new AntPathRequestMatcher("/admin/**")) 
     .csrf().disable()  
     .authorizeRequests().antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .and().formLogin().loginPage("/adminlogin");