Как отображать собственное сообщение об ошибке в jsp для spring исключение auth безопасности
Я хочу показать пользовательское сообщение об ошибке в 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, чтобы найти ключ исключения аутентификации и отобразить другое сообщение
Ответы
Ответ 1
Переопределите свойства в messages.properties внутри spring банка безопасности. Например, добавьте путь к классу myMessages.properties и добавьте источник сообщения в контекст:
AbstractUserDetailsAuthenticationProvider.badCredentials=Username/Password entered is incorrect.
AbstractUserDetailsAuthenticationProvider.disabled=Your account is diabled, please contact administrator.
У Сальвина Фрэнсиса:
- Добавьте myMessages.properties в WAR файл внутри WEB-INF/classes.
- Добавьте этот bean в spring файл конфигурации контекста
Источник сообщения bean
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>myMessages</value>
</list>
</property>
</bean>
Ответ 2
После добавления "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 Конфигурация контекста безопасности:
<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>
Я надеюсь, что это поможет другим, у кого есть эта проблема.
Ответ 3
Вот это исправление для 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')}
Ответ 4
Я новичок в spring, но попробуйте это на сервере:
throw new BadCredentialsException("This is my custom message !!");
Конечно, для этого вам нужен класс, который является поставщиком проверки подлинности.