comment afficher un message d'erreur personnalisé dans JSP pour spring security auth exception

Je souhaite afficher un message d'erreur personnalisé dans jsp pour les exceptions d'authentification spring security.

Pour un nom d'utilisateur ou un mot de passe erroné,

spring displays : Bad credentials
what I need     : Username/Password entered is incorrect.

Pour l'utilisateur est désactivé,

spring displays : User is disabled
what I need     : Your account is diabled, please contact administrator.

Dois-je remplacer AuthenticationProcessingFilter juste pour cela? ou bien puis-je faire quelque chose dans jsp lui-même pour trouver la clé d'exception d'authentification et afficher un message différent

30
demandé sur skaffman 2009-09-03 17:25:32

4 réponses

Redéfinissez les propriétés dans les messages .propriétés à l'intérieur de la sécurité printemps jar. Par exemple, ajoutez au classpath myMessages.propriétés {[4] } et ajouter une source de message au contexte:

AbstractUserDetailsAuthenticationProvider.badCredentials=Username/Password entered is incorrect.
AbstractUserDetailsAuthenticationProvider.disabled=Your account is diabled, please contact administrator.

À Salvin Francis:

  1. ajouter myMessages.propriétés du fichier WAR dans WEB-INF/classes.
  2. ajouter ce bean au fichier de configuration du contexte spring

Message De La Source De Haricot

<bean id="messageSource"   
    class="org.springframework.context.support.ResourceBundleMessageSource">  
    <property name="basenames">  
        <list>
            <value>myMessages</value>
        </list>
    </property>
</bean>
31
répondu rodrigoap 2012-05-10 04:07:24

Après avoir ajouté le bean" messageSource", j'ai eu des problèmes pour que le Message D'erreur fonctionne avec CookieLocaleResolver car le DispatcherServlet (qui l'utilise automatiquement pour votre application) est appelé après la sécurité. Voir: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

Ma Solution était un filtre personnalisé qui définit le LocalContextHolder:

public class LocaleContextFilter extends OncePerRequestFilter {
    private LocaleResolver localeResolver;
    public void setLocaleResolver(LocaleResolver localeResolver) {
        this.localeResolver = localeResolver;
    }
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {
        // store Local into ThreadLocale
        if (this.localeResolver != null) {
            final Locale locale = this.localeResolver.resolveLocale(request);
            LocaleContextHolder.setLocale(locale);
        }
        try {
            filterChain.doFilter(request, response);
        } finally {
            LocaleContextHolder.resetLocaleContext();
        }
    }
}

Et le contexte de sécurité du printemps configuration:

  <http use-expressions="true">
    <custom-filter ref="localeContextFilter" after="FIRST" />
    .....
  </http>
  <beans:bean id="localeContextFilter" class="at.telekom.ppp.util.opce.fe.interceptor.LocaleContextFilter" >
    <beans:property name="localeResolver" ref="localeResolver" /><!-- e.g.: CookieLocaleResolver -->
  </beans:bean>

J'espère que cela aide les autres qui ont ce problème.

3
répondu brabenetz 2012-05-09 19:48:48

Voici un correctif JSP EL pour cela. Plus d'un hack qu'une solution élégante, mais fait le travail rapide et sale. Mise en garde - ce n'est pas i18n sûr! Seulement L'Anglais.

Cela nécessite la bibliothèque de balises functions:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

Et le code de remplacement:

${fn:replace(SPRING_SECURITY_LAST_EXCEPTION.message, 'Bad credentials', 'Username/Password are incorrect')}
2
répondu Danny C 2010-02-04 11:19:17

Je suis nouveau au printemps, mais essayez ceci sur le serveur:

throw new BadCredentialsException("This is my custom message !!");

Bien sûr, vous avez besoin d'une classe qui est un fournisseur d'authentification pour que cela fonctionne.

0
répondu Salvin Francis 2011-02-04 02:46:37