Хороший вопрос, это может немного сбивать с толку, поскольку это означает, что законному клиенту, только с неверным паролем, может быть отказано в доступе к странице, которую остальной мир может увидеть без учетных данных.
На самом деле,это по замыслу.Вообще говоря, система авторизации должна знать, кто пользователь, прежде чем узнает, может ли пользователь выполнять операции 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.