1 回答

TA貢獻1765條經驗 獲得超5個贊
好問題,這可能有點令人困惑,因為這意味著合法客戶端,只是密碼錯誤,就可以被拒絕一個沒有憑據的世界其他地方可以看到的頁面。
實際上,這是設計使然。一般來說,授權系統需要先知道用戶是誰,然后才能知道用戶是否可以執行 X、Y 或 Z 操作。即使使用公共終結點,當用戶處于上下文中時,終結點的行為也可能不同。因此,實際上,它們是單獨的系統,首先要進行身份驗證:如果請求提供憑據,則框架將嘗試對用戶進行身份驗證,并相應地接受或拒絕請求。
一個選項
我意識到你沒有問如何解決它(你可能對行為完全滿意,只是好奇),但你可以做的一件事是將其配置為忽略故障,只是為了那個端點:BasicAuthenticationFilter
static class IgnoreFailuresBasicAuthenticationFilter extends BasicAuthenticationFilter {
private final BasicAuthenticationFilter everythingElse;
public IgnoreFailuresBasicAuthenticationFilter(BasicAuthenticationFilter everythingElse) {
super(everythingElse.getAuthenticationManager());
this.everythingElse = everythingElse;
}
protected void doFilterInternal(request, response, chain) {
if ("/api/v1/notification".equals(request.getPathInfo())) {
super.doFilterInternal(request, response, chain);
} else {
this.everythingElse.doFilterInternal(request, response, chain);
}
}
}
然后替換 DSL 中的過濾器:
http
.httpBasic()
.withObjectPostProcessor(
new ObjectPostProcessor<BasicAuthenticationFilter>() {
public BasicAuthenticationFilter postProcess(BasicAuthenticationFilter filter) {
return new IgnoreFailuresBasicAuthenticationFilter(filter);
}
});
這將允許篩選器鏈繼續,即使基本身份驗證失敗也是如此。結果是,在身份驗證失敗的情況下,您將獲得403而不是401。
添加回答
舉報