Подтвердить что ты не робот

Как отображать собственное сообщение об ошибке в 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, чтобы найти ключ исключения аутентификации и отобразить другое сообщение

4b9b3361

Ответ 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 !!");

Конечно, для этого вам нужен класс, который является поставщиком проверки подлинности.