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。
添加回答
举报