2017-04-19 388 views
0

我正在使用Spring Security編寫一個應用程序。 我已經實現了我的自定義UserDetails,UserDetailsS​​ervice,AccessDecisionVoter和WebSecurityConfigurerAdapter。 我想允許未經授權的用戶訪問/authenthication/login頁面進行登錄,但是對頁面的所有其他訪問都需要由自定義AccessDecisionVoter進行處理。
我定製WebSecurityConfigurerAdapter類看起來是這樣的:Spring Security:認證頁面permitAll似乎被忽略

@Configuration 
@EnableWebSecurity 
@ComponentScan(value = "security") 
public class Configuration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsServiceImpl userDetailsServiceImpl; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/authentication/login**") 
       .permitAll() 
       .and() 
      .authorizeRequests() 
       .anyRequest() 
       .authenticated() 
       .accessDecisionManager(accessDecisionManager()) 
     ; 
    } 


    @Bean 
    public AccessDecisionManager accessDecisionManager() { 
     List<AccessDecisionVoter<? extends Object>> decisionVoters = 
       Arrays.asList(new AccessDecisionVoterImpl()); 
     return new UnanimousBased(decisionVoters); 
    } 


    @Override 
    protected void configure(AuthenticationManagerBuilder auth) { 
     try { 
      auth.userDetailsService(userDetailsServiceImpl); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    @Bean 
    public UserDetailsServiceImpl userDetailsService() { 
     return userDetailsServiceImpl; 
    } 

} 

我在數據庫中定義了幾個角色。我的自定義AccessDecisionVoter中的vote方法根據該方法和URL + httpMethod檢索已登錄的用戶的權限並授予或拒絕訪問權限。

問題:
然而,當我發送POST到/認證/註冊的用戶名和密碼,我的代碼爲我提供了自定義的AccessDecisionVoter一個NullPointerException:用戶名(通過authentication.getPrincipal();回報anonymousUser檢索,這導致但我不明白爲什麼vote方法被調用,因爲配置文件告訴Spring允許所有訪問/認證/登錄

回答

0

我相信,你有它的方式設置,permitAll只是使得所有請求都被允許(即使未經驗證的請求),但它不會禁用該請求的安全鏈,它仍然會嘗試處理t通過他們所有。如果您只是想繞過所有的安全性,我通常使用的方法是覆蓋webSecurity配置方法,並在其中添加例外情況,如下所示:

@Override 
public void configure(WebSecurity webSecurity) throws Exception 
{ 
    webSecurity 
     .ignoring() 
     .antMatchers("/authentication/login**"); 
} 
+0

謝謝。這確實解決了我的問題。但暴露了另一個.. – Matthias