2013-12-12 195 views
4

我使用的是具有java配置和兩個HttpSecurity配置的spring-security 3.2.0.RC2。一個用於REST API,另一個用於UI。 當我發佈到/註銷它重定向到/ login?註銷,但然後(不正確)重定向到/登錄。 當我成功輸入用戶名和密碼時,我將重定向到登錄?註銷,並且必須再次輸入憑據以進入主頁面。 所以看起來像permitAll登錄是不是榮幸的登錄?註銷。彈簧安全登錄?註銷重定向登錄

我的安全配置是這樣的:

@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(); 
    } 

} 

} 

任何人都可以解釋爲什麼發生這種情況或有什麼不對我的配置?

我看到這個配置的第二個問題是,雖然sec:authorize access = ... does not work,但是jsp標籤sec:authorize url = ...不起作用。 在url = ...大小寫的情況下,即使用戶未被授權,也會始終顯示內容。 我知道用戶沒有被授權,因爲它應該已經被sec隱藏的鏈接:授權標籤導致403 Forbidden。

對此的任何幫助非常感謝!

回答

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(); 
} 

回答我的問題的情況下,它可以幫助別人誰運行到這個bug。

+0

這解決了我的問題 - 但我仍然不確定是什麼讓重定向登錄?註銷 - 我沒有在我的代碼在任何地方......是一個春季安全的事情? –

+0

@wwarren很高興幫助。當春季安全處理註銷時,重定向到登錄?註銷以顯示「您已被註銷」的登錄頁面。信息。 – 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(); 

其原因是,在這種情況下permitAll(),URL模式有範圍限制到"/login/**"