27 votes

comment afficher un message d'erreur personnalisé dans un jsp pour une exception d'authentification de sécurité de spring

Je veux afficher un message d'erreur personnalisé dans le jsp pour les exceptions d'authentification de sécurité de Spring.

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 surcharger AuthenticationProcessingFilter juste pour cela ? ou puis-je faire quelque chose dans le jsp lui-même pour trouver la clé d'exception d'authentification et afficher un message différent ?

30voto

rodrigoap Points 4755

Redéfinir les propriétés dans messages.properties bocal de sécurité à ressort intérieur. Par exemple, ajoutez au classpath mesMessages.properties et ajouter une source de messages au contexte :

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

A Salvin Francis :

  1. Ajoutez myMessages.properties au fichier WAR dans WEB-INF/classes.
  2. Ajouter ce bean au fichier de configuration du contexte de Spring

Message Source Bean

<bean id="messageSource"   
    class="org.springframework.context.support.ResourceBundleMessageSource">  
    <property name="basenames">  
        <list>
            <value>myMessages</value>
        </list>
    </property>
</bean>

2voto

Danny C Points 2042

Voici un correctif JSP EL pour cela. Il s'agit plus d'un piratage que d'une solution élégante, mais il permet de faire le travail rapidement et proprement. Avertissement : cette solution n'est pas sûre pour les langues étrangères ! Uniquement en anglais.

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

<%@ 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')}

2voto

brabenetz Points 71

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

Ma solution est 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 la configuration du Contexte de Sécurité de Spring :

  <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 aidera les autres qui ont ce problème.

0voto

Salvin Francis Points 1408

Je suis nouveau au printemps, mais essayez ceci au 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X