如何在jsp中显示spring security auth exception的自定义错误消息

时间:2009-09-03 13:25:32

标签: java spring spring-mvc spring-security

我想在jsp中显示自定义错误消息以获取Spring安全认证异常。

错误的用户名或密码

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

对于用户已停用,

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

我是否需要为此重写AuthenticationProcessingFilter?或者我可以在jsp本身做一些事情来找到身份验证例外键并显示不同的消息

4 个答案:

答案 0 :(得分:31)

重新定义spring security jar中 messages.properties 中的属性。例如,添加到类路径 myMessages.properties 并向上下文添加消息源:

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

在Salvin Francis:

  1. 将myMessages.properties添加到WEB-INF / classes中的WAR文件。
  2. 将此bean添加到spring context config file
  3. 消息源Bean

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

答案 1 :(得分:3)

添加“messageSource”bean之后,我遇到了使用CookieLocaleResolver使错误消息工作的问题,因为在安全性之后会调用DispatcherServlet(它会自动为您的应用程序使用它)。 请参阅:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

我的解决方案是一个自定义过滤器,用于设置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();
        }
    }
}

Spring Security Context配置:

  <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>

我希望这可以帮助有这个问题的其他人。

答案 2 :(得分:2)

这是针对此的JSP EL修复程序。更多的是黑客而不是优雅的解决方案,但是快速而且肮脏地完成工作。警告 - 这不是安全的!只有英文。

这需要函数标记库:

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

替换代码:

${fn:replace(SPRING_SECURITY_LAST_EXCEPTION.message, 'Bad credentials', 'Username/Password are incorrect')}

答案 3 :(得分:0)

我是春天新手,但在服务器上试试这个:

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

当然,您需要一个作为身份验证提供程序的类来实现此目的。