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
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:
- ajouter myMessages.propriétés du fichier WAR dans WEB-INF/classes.
- 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>
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.
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')}
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.