2012-10-04 11 views
10

Ho un'app che utilizza Spring Security 3.0.x. Ci ho un personalizzato AuthenticationProvider:Spring security autentica gestione delle eccezioni

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

mi piacerebbe inviare i codici di risposta cutom su ogni eccezione, ad esempio 404 per UsernameNotFoundException, 403 per DisabledException ecc Per ora non mi resta che l'autenticazione-fallimento-url nella mia molla la configurazione di sicurezza in modo da ottenere il reindirizzamento su ogni eccezione in authenticate().

risposta

19

autenticazione handler fallimento:

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

configurazione:

<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

Non ho trovato un metodo showMessage() nella classe SimpleUrlAuthenticationFailureHandler (sto utilizzando Spring Security versione 3.1.x). Sai quale versione stavi usando? –

+0

Siamo spiacenti, il metodo showMessage è specifico per la mia implementazione e non viene dalla primavera. Il codice originale era troppo da mostrare. – baraber

+0

@baraber come passare il tipo di eccezione al metodo controller? – gstackoverflow

14

In genere è una cattiva idea fornire dettagli sui motivi per cui un'autenticazione non è riuscita in quanto può fornire a un utente malintenzionato informazioni utili. Ad esempio, può consentire loro di sondare nomi di account validi.

Se è necessario personalizzare le cose, quindi invece di usare un authentication-failure-url, è possibile utilizzare authentication-failure-handler-ref per iniettare una consuetudine AuthenticationFailureHandler fagioli in cui è possibile implementare un comportamento diverso a seconda l'eccezione.

+0

Come passare informazioni da AuthenticationFailureHandler al controller metodo? – gstackoverflow

5

utilizzare i tag di sotto della autenticazione Personalizza nella pagina 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> 

comprendono anche la libreria di tag sotto per funzionare correttamente

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

...