您應該避免使用默認org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
,因爲它從您的請求的參數中獲取客戶端提供的用戶名和密碼,您確實需要從頭文件中獲取它們。
所以,你應該寫一個自定義AuthenticationFilter
延伸簡稱UsernamePasswordAuthenticationFilter
改變其行爲,以滿足您的要求:
public class HeaderUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
/**
*
*/
public HeaderUsernamePasswordAuthenticationFilter() {
super();
this.setFilterProcessesUrl("/**");
this.setPostOnly(false);
}
/* (non-Javadoc)
* @see org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#obtainPassword(javax.servlet.http.HttpServletRequest)
*/
@Override
protected String obtainPassword(HttpServletRequest request) {
return request.getHeader(this.getPasswordParameter());
}
/* (non-Javadoc)
* @see org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#obtainUsername(javax.servlet.http.HttpServletRequest)
*/
@Override
protected String obtainUsername(HttpServletRequest request) {
return request.getHeader(this.getPasswordParameter());
}
}
這個過濾器例子擴展org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
傾聽每一個請求,並從頭,而不是parameters
得到username
和password
。
那麼你應該更改配置這樣,在UsernamePasswordAuthenticationFilter
位置設置你的過濾器:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterAt(
new HeaderUsernamePasswordAuthenticationFilter(),
UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.antMatchers("/index.html").permitAll()
.antMatchers("/swagger-ui.html").hasRole("ADMIN")
.anyRequest().authenticated();
}
你的意思是用'Authentication'基本身份驗證頭? – dur
你的意思是什麼HTTP頭,頭的名稱是什麼? – dur