2012-10-04 30 views
10

Tengo una aplicación que usa Spring Security 3.0.x. No tengo una costumbre AuthenticationProvider:Seguridad de primavera autenticar excepciones manejo

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

Me gustaría enviar códigos de respuesta cutom en cada excepción, por ejemplo 404 UsernameNotFoundException, 403 para DisabledException etc. Por ahora sólo tengo la autenticación de fracaso-url en mi configuración de seguridad de primavera, así que me redirigen a ella en cada excepción en authenticate().

Respuesta

19

autenticación manejador de fallos:

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"); 
    } 
} 

configuración:

<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> 
+0

No encontré un método showMessage() en la clase SimpleUrlAuthenticationFailureHandler (estoy usando Spring Security versión 3.1.x). ¿Sabes qué versión estás usando? –

+0

Disculpe, el método showMessage es específico de mi implementación y no proviene de la primavera. El código original era demasiado para mostrar. – baraber

+0

@baraber ¿cómo pasar el tipo de excepción al método del controlador? – gstackoverflow

14

Por lo general, es una mala idea proporcionar detalles sobre por qué falló una autenticación, ya que puede proporcionar a un atacante información útil. Por ejemplo, puede permitirles buscar nombres de cuenta válidos.

Si necesita personalizar las cosas, entonces, en lugar de usar authentication-failure-url, puede usar authentication-failure-handler-ref para inyectar un bean personalizado AuthenticationFailureHandler donde puede implementar un comportamiento diferente según la excepción.

+0

cómo pasar información de AuthenticationFailureHandler al controlador método? – gstackoverflow

5

utilizar las etiquetas siguientes para su autenticación en Personalizar en la página 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> 

incluyen también la biblioteca de etiquetas a continuación para que funcione correctamente

<%@ 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"%> 

...