我想在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本身做一些事情来找到身份验证例外键并显示不同的消息
答案 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:
消息源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 !!");
当然,您需要一个作为身份验证提供程序的类来实现此目的。