Отображение пользовательского сообщения об ошибке с использованием Spring-Security

Я сталкиваюсь с некоторыми проблемами в конфигурации весенней безопасности. Мне нужно отобразить пользовательское сообщение на моей веб-странице, когда вход в систему не удается.

Происходит двухуровневая аутентификация: 1. сайт миндер 2. база данных

Мой пользовательский обработчик ошибок успешно вызывается (authentication-fail-handler-ref="authFailureHandler"), когда пользователь вводит недопустимое имя пользователя / pwd (произойдет сбой на сайте minder), и поэтому я могу показать недопустимое сообщение об ошибке.

Когда аутентификация siteminder успешна, а пользователь недоступен в базе данных, мой пользовательский обработчик ошибок (authentication-fail-handler-ref="authFailureHandler") не вызывается вообще. вместо этого он выполняет ряд других обработчиков ошибок и, наконец, выполняется logout-url и перенаправляется обратно на страницу index.html (страницу входа) без сообщения об ошибке.

Пожалуйста, предложите мне это и дайте мне знать, где я иду не так.

Ниже приведен конфигурационный файл Spring-Security и другие подробности.

SPRING.SECURITY.XML


<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/resources/app/commons/**" access="permitAll"/>
    <security:intercept-url pattern="/resources/app/template/**" access="permitAll"/>
    <security:intercept-url pattern="/resources/app/**" access="hasAnyRole('M_XXX', 'M_XXX')"/>
    <security:intercept-url pattern="/app/template/**" access="permitAll"/>
    <security:intercept-url pattern="/app/**" access="hasAnyRole('M_VVV', 'M_XXX')"/>

    <security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />

    <!-- The  authentication-failure url is handled in authFailureHandler -->
    <security:form-login always-use-default-target="true"
                         authentication-failure-url="/index.html?login_error=1"
                         login-page="/index.html"
                         default-target-url="/app/home"
                         login-processing-url="/doLogin" authentication-failure-handler-ref="authFailureHandler"/>
    <security:logout invalidate-session="true" logout-success-url="/index.html" logout-url="/doLogout" />
    <security:session-management invalid-session-url="/index.html"  />
</security:http>

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="preAuthenticatedUserDetailsService">
        <bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <property name="userDetailsService" ref="userDetailsService" />
        </bean>
    </property>
</bean>

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

AuthFailureHandler.java


@Override
public void onAuthenticationFailure(HttpServletRequest request,
        HttpServletResponse response, AuthenticationException exception)
        throws IOException, ServletException {

    if (LOG.isDebugEnabled()) {
        LOG.debug("Error message set in  threadlocal is :"
                + AuthErrorMsgThreadLocal.get());
    }

    // Login failed in Siteminder, so no threadlocal message
    if (StringUtils.isEmpty(AuthErrorMsgThreadLocal.get())) {
        request.getSession().setAttribute("AUTH_ERROR_MSG",
                "Invalid Username or Password");
        response.sendRedirect(request.getContextPath() + ERROR_REDIRECT_URL);
    } else {
        // in the event of an auth failure, get the specific error message
        // from threadlocal
        request.getSession().setAttribute("AUTH_ERROR_MSG",
                AuthErrorMsgThreadLocal.get());
        response.sendRedirect(request.getContextPath() + ERROR_REDIRECT_URL);
        AuthErrorMsgThreadLocal.unset();

    }
}

0 ответов

Другие вопросы по тегам