Spring проверка подлинности с проверкой подлинности безопасности

У меня есть приложение, использующее Spring Security 3.0.x. Там у меня есть пользовательский AuthenticationProvider:

public class AppAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        ...
        if (!check1()) throw new UsernameNotFoundException();
        if (!check2()) throw new DisabledException();
        ...
    }

Я бы хотел послать коды ответа куба на каждое исключение, например 404 для UsernameNotFoundException, 403 для DisabledException и т.д. На данный момент у меня есть только идентификатор-ошибка-url в моей конфигурации безопасности Spring, поэтому я перенаправляюсь на него для каждого исключения в authenticate().

Ответ 1

Обработчик ошибок аутентификации:

public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
  super.onAuthenticationFailure(request, response, exception);
  if(exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) {
    showMessage("BAD_CREDENTIAL");
  } else if (exception.getClass().isAssignableFrom(DisabledException.class)) {
    showMessage("USER_DISABLED");
  }
}

конфигурация:

<bean id="customAuthenticationFailureHandler"
      class="com.apackage.CustomAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/index.jsp"/>
</bean>
<security:http auto-config="true">
  <security:form-login default-target-url="/welcome.jsp" authentication-failure-handler-ref="customAuthenticationFailureHandler" />
</security:http>

Ответ 2

Как правило, это плохая идея предоставить подробную информацию о том, почему аутентификация не удалась, поскольку она может предоставить злоумышленнику полезную информацию. Например, он позволяет им проверять правильные имена учетных записей.

Если вам нужно настроить все, вместо использования authentication-failure-url, вы можете использовать authentication-failure-handler-ref для добавления пользовательского AuthenticationFailureHandler bean, где вы можете реализовать различное поведение в зависимости от исключения.

Ответ 3

Используйте теги ниже, чтобы настроить аутентификацию на странице jsp.

<c:if test="${sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message eq 'Bad credentials'}">
Username/Password entered is incorrect.
</c:if>
<c:if test="${sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message eq 'User is disabled'}">
Your account is disabled, please contact administrator.
</c:if>
<c:if test="${fn:containsIgnoreCase(sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message,'A communications error has been detected')}">
Database connection is down, try after sometime.
</c:if>

Также включите нижеприведенную библиотеку тегов для правильной работы

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec"%>

...