2012-10-04 2 views
10

J'ai une application utilisant Spring Security 3.0.x. Là, j'ai une coutume AuthenticationProvider:Sécurité de printemps authentifier les exceptions gérer

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

Je voudrais envoyer les codes de réponse cutom à chaque exception, par exemple 404 pour UsernameNotFoundException, 403 pour DisabledException etc. Pour l'instant, j'ai juste en cas de panne URL d'authentification dans mon configuration de sécurité de printemps ainsi je me redirige vers chaque exception dans authenticate().

Répondre

19

gestionnaire d'échec d'authentification:

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

:

<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

Je n'ai pas trouvé de méthode showMessage() dans la classe SimpleUrlAuthenticationFailureHandler (j'utilise Spring Security version 3.1.x). Savez-vous quelle version vous utilisiez? –

+0

Désolé, la méthode showMessage est spécifique à mon implémentation et ne vient pas du printemps. Le code original était trop à montrer. – baraber

+0

@baraber comment passer le type d'exception à la méthode du contrôleur? – gstackoverflow

14

C'est généralement une mauvaise idée de fournir des détails sur les raisons pour lesquelles une authentification a échoué car elle peut fournir à un attaquant des informations utiles. Par exemple, il peut leur permettre de rechercher des noms de compte valides.

Si vous avez besoin de personnaliser les choses, alors plutôt que d'utiliser un authentication-failure-url, vous pouvez utiliser authentication-failure-handler-ref pour injecter un bean personnalisé AuthenticationFailureHandler où vous pouvez implémenter un comportement différent en fonction de l'exception.

+0

comment transmettre des informations de AuthenticationFailureHandler au contrôleur méthode? – gstackoverflow

5

Utilisez les balises ci-dessous pour votre authentification customize dans la page 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> 

comprennent également la bibliothèque de balises ci-dessous pour bien travailler

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

...

Questions connexes