Обработка UserNotFoundException в PreAuthenticationProvider - PullRequest
3 голосов
/ 18 октября 2011

У меня есть два провайдера аутентификации. Один проверяет базу данных, а другой является провайдером с предварительной аутентификацией для подтверждения SAML.

Информация о пользователе и его соответствующие роли сохраняются в БД. Поэтому, когда пользователь запускает приложение с помощью SAML, мы вставляем строку в базу данных и назначаем роль по умолчанию, после чего перенаправляем пользователя на страницу регистрации, где мы собираем некоторую информацию, специфичную для пользователя.

С PreAuthenticatedProvider я ловлю UserNotFoundException, и вопрос в том, как мне перенаправить пользователя на страницу регистрации из моего метода аутентификации?

    @Override
    public Authentication authenticate(Authentication authentication) 
            throws AuthenticationException {
        try {
           // custom code
        } catch (UsernameNotFoundException e) {
           // Redirect user to a view
        }
    }

Есть ли лучший способ обработки таких случаев?

РЕДАКТИРОВАТЬ: Я заинтересован в обработке исключений аутентификации, поступающих от провайдеров аутентификации, особенно PreAuthenticationProviders.

1 Ответ

1 голос
/ 26 июня 2013

Вы можете написать свой собственный пользовательский ExceptionTranslationFilter и поместить его в цепочку фильтров перед фильтром обработки формы, чтобы перехватить эти исключения и правильно обработать их.

Примерно так в application-context.xml

    <bean id="customExceptionFilter" class="com.company.module.security.filters.CustomExceptionTranslationFilter">
        <constructor-arg ref="authenticationEntryPoint"/>
        <constructor-arg ref="savedRequestCache"></constructor-arg>
        <property name="accessDeniedHandler" ref="customAccessDeniedHandler"/>
    </bean>

Ваш ExceptionTransalationFilter необходимо расширить ExceptionTranslationFilter и переопределить doFilter Метод:

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
            ServletException
    {
        try
        {
            super.doFilter(req, res, chain);
        }
        catch (Exception ex)
        {
                    // Handle the exception here
            logger.error("Exception - ", ex);
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            if (SecurityHelper.isAjaxRequest(request))
            {
                writeFailedAjaxResponse(response, ErrorCode.INTERNAL_ERROR);
                return;
            }
            else
            {
                throw new ServletException(ex);
            }
        }
    }

Смотрите в 8.2 здесь:

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-web-filters.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...