2013-12-12 4 views
4

Я использую Spring-security 3.2.0.RC2 с конфигурацией java и двумя конфигурациями HttpSecurity. Один для REST API и один для пользовательского интерфейса. Когда я отправляю в/logout, он перенаправляется в/login? Logout, но затем (неправильно) перенаправляет/login. Когда я ввожу имя пользователя и пароль успешно, я получаю перенаправление на вход в систему logout и должен ввести учетные данные во второй раз, чтобы перейти на главную страницу. Итак, похоже, что разрешение для входа в систему не выполняется для входа в систему.spring-security login? Logout перенаправляет на логин

Моя конфигурация безопасности выглядит следующим образом:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Resource 
private MyUserDetailsService userDetailsService; 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) 
     throws Exception { 
    StandardPasswordEncoder encoder = new StandardPasswordEncoder(); 
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder); 
} 

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

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatcher("/v1/**").authorizeRequests() 
       .antMatchers("/v1/admin/**").hasRole("admin") 
       .antMatchers("/v1/account/**").hasRole("admin") 
       .antMatchers("/v1/plant/**").access("hasRole('admin') or hasRole('dataProvider')") 
       .antMatchers("/v1/upload/**").access("hasRole('admin') or hasRole('dataProvider')") 
       .antMatchers("/v1/**").authenticated() 
      .and().httpBasic(); 
    } 
} 

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

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/resources/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/account/**").hasRole("admin") 
       .antMatchers("/admin/**").hasRole("admin") 
       .antMatchers("/plant/**").access("hasRole('admin') or hasRole('dataProvider')") 
       .antMatchers("/upload/**").access("hasRole('admin') or hasRole('dataProvider')") 
       .anyRequest().authenticated() 
      .and().formLogin().loginPage("/login").permitAll(); 
    } 

} 

} 

Может кто-нибудь объяснить, почему это происходит, или что не так с моей конфигурации?

Вторая проблема, которую я вижу в этой конфигурации, заключается в том, что jsp tag sec: authorize url = ... не работает, хотя sec: authorize access = ... работает. В случае url = ... он всегда отображает контент, даже если пользователь не авторизован. Я знаю, что пользователь не авторизовался, потому что ударил ссылку, которая должна была быть скрыта секцией: разрешить тег в 403 Запрещено.

Любая помощь в этом очень ценится!

ответ

4

Я нашел обходное решение для этой очевидной ошибки. я добавил permitAll() вкл/логин/** следующим образом:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
      .antMatchers("/account/request/**").permitAll() 
      .antMatchers("/login/**").permitAll() 
      .antMatchers("/account/change_password/**").authenticated() 
      .antMatchers("/account/**").hasAuthority("admin") 
      .antMatchers("/admin/**").hasAuthority("admin") 
      .antMatchers("/plant/**").hasAnyAuthority("admin", "dataProvider") 
      .antMatchers("/upload/**").hasAnyAuthority("admin", "dataProvider") 
      .anyRequest().authenticated() 
     .and().formLogin().loginPage("/login").permitAll(); 
} 

Отвечая на мой собственный вопрос в случае, если это помогает кому-либо еще, кто работает в этой ошибке.

+0

Это исправило мою проблему - но я все еще не уверен, что делает перенаправление для входа в систему? logout - у меня нет этого в моем коде где угодно ... это весенняя вещь безопасности? –

+0

@wwarren Рад, что это помогло. Когда весенняя безопасность обрабатывает выход из системы ti, перенаправляется на вход в систему login logout, чтобы показать страницу входа в систему с «Вы были выведены из системы». сообщение. – shawnim

2

Вместо этого:

.antMatchers("/login/**").permitAll() 

Я думаю, что лучшим решением было бы это:

http 
    .authorizeRequests() 
     .antMatchers("/account/request/**").permitAll() 
     .*antMatchers("/login").permitAll() 
     .antMatchers("/account/change_password/**").authenticated() 
     .antMatchers("/account/**").hasAuthority("admin") 
     .antMatchers("/admin/**").hasAuthority("admin") 
     .antMatchers("/plant/**").hasAnyAuthority("admin", "dataProvider") 
     .antMatchers("/upload/**").hasAnyAuthority("admin", "dataProvider") 
     .anyRequest().authenticated() 
    .and().formLogin().loginPage("/login").permitAll(). 
    .and().logout().logoutSuccessUrl("/login?logout").permitAll(); 

Причина в том, шаблон URL для permitAll(), в этом случае имеет ограниченные масштабы по сравнению до "/login/**"

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