2016-08-20 3 views
0

У меня есть фильтр, который распространяется AbstractAuthenticationProcessingFilter.Фильтр дважды запускается в проекте Spring Boot

В классе конфигурации безопасности у меня ниже,

@Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http.addFilterBefore(getMyFilter(), BasicAuthenticationFilter.class); 
     http.addFilterAfter(getMyFilter2(), MyFilter.class); 
     http.csrf().disable().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll(); 
    } 

    private MyFilter getMyFilter() { 
     return new MyFilter(properties, apiConsumer); 
    } 

Когда я запустим REST конечной точки с почтальоном, то doFilter метод MyFilter получить хиты в два раза. В обоих случаях он имеет то же самое requestedSessionId и strippedServletPath в ServletRequest.

Но MyFilter2, которые распространяются GenericFilterBean, только один раз вызвать.

Порядок выполнения фильтрующей MyFilter.doFilter ->MyFilter2.doFilter ->MyFilter.doFilter

Что бы быть причиной и как я могу найти причину?

+1

я определил MyFilter с @Component аннотации. Когда я удаляю эту аннотацию, она попадает только один раз – Harshana

ответ

0

Я предполагаю, что это поведение появляется только при первом запросе (при появлении всплывающего окна базовой аутентификации). Если это так, то это потому, что базовая спецификация аутентификации и ее реализация в Spring BasicAuthenticationFilter.

Когда вы вызываете свою услугу в первый раз, Spring ищет заголовок Authorization по вашему запросу, а если нет, он отправляет ответ с заголовком WWW-Authenticate: Basic в ваш браузер. Когда ваш браузер получает этот ответ с этим конкретным заголовком, он показывает всплывающее окно аутентификации. Когда вы вводите своего пользователя и пароль, ваш браузер делает другой запрос (теперь с соответствующим заголовком Authorization), и теперь Spring может правильно разрешить ваш запрос.

Проблема заключается в том, что в течение всего этого процесса Spring дважды обрабатывает цепочку фильтров (по каждому запросу).

Вы можете прочитать больше о базовой аутентификации здесь: https://en.wikipedia.org/wiki/Basic_access_authentication

+1

Спасибо, но я использую почтальон для вызова запроса. Я не получаю такое всплывающее окно для проверки подлинности. – Harshana

+0

Если вы используете почтальон, и это авторизация «Basic Auth», то он будет работать одинаково (почтальон обрабатывает этот процесс многоступенчатой ​​аутентификации) –

+0

Я выбираю No auth – Harshana

Смежные вопросы