我正在使用Spring Security編寫一個應用程序。 我已經實現了我的自定義UserDetails,UserDetailsService,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允許所有訪問/認證/登錄
謝謝。這確實解決了我的問題。但暴露了另一個.. – Matthias