HandlerInterceptorAdapter не запускается при входе в систему с помощью Spring Security

Мой перехватчик работает во всех запросах, кроме входа в систему.

Перехватчик:

public class MultitenantHandler extends HandlerInterceptorAdapter {

        private static final Logger log = LoggerFactory.getLogger(MultitenantHandler.class);

        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler){

            String origin = req.getHeader("Origin");
            log.debug("Origin: "+origin);

            if (origin == null) {
                origin = "localhost";
            }

            int indexDot = origin.indexOf(".");
            int indexDash = origin.indexOf("://") + 3;

            String tenant = "";

            if (indexDot == -1) {
                tenant = "experter";
                log.warn("Using default tenant");
                TenantContext.setCurrentTenant(tenant);

            } else {
                tenant = origin.substring(indexDash, indexDot);
                log.info("Using tenant: " + tenant);
                TenantContext.setCurrentTenant(tenant);
            }

            return true;

        }
}

На WebMvcConfigurerAdapter регистрируюсь так:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MultitenantHandler());
    }

Это моя конфигурация безопасности:

@Configuration
@EnableWebSecurity
@Profile({"development", "demo", "default"})
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final Logger log = LoggerFactory.getLogger(SecurityConfig.class);

    @Autowired
    private CustomUserDetailsService customUserDetailsService;
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private RESTAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    private RESTLogoutSuccessHandler logoutSuccessHandler;

    @Autowired
    private JWTAuthenticationFailureHandler authenticationFailureHandler;

    @Autowired
    private JWTAuthenticationSuccessHandler authenticationSuccessHandler;

    @Autowired
    private StatelessAuthenticationFilter statelessAuthFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable()
                .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);

        http.formLogin().permitAll()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(authenticationFailureHandler);

        http.logout().permitAll()
                .logoutSuccessHandler(logoutSuccessHandler);

        http.addFilterBefore(statelessAuthFilter, UsernamePasswordAuthenticationFilter.class);

        http.authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers("/v2/api-docs").hasRole("ADMIN")
                .antMatchers("/login").permitAll()
                .antMatchers("/login/changePassword").permitAll()
                .antMatchers("/user/image").permitAll()
                .antMatchers("/social/login/facebook").permitAll()
                .antMatchers("/actuator/**").hasRole("ADMIN")
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/**").hasRole("USER");

        log.info("Configuration of http complete.");
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder);
    }

Когда я запрашиваю /login, перехватчик не запускается, в другом запросе, даже не зарегистрированном, перехватчик работает нормально.

Мне нужно выполнить перехватчик перед любым запросом, потому что мне нужно установить базу данных в соответствии с запросом URL.

Если вам нужна дополнительная информация, пожалуйста, скажите мне, что я могу опубликовать здесь.


person Marcos Nunes    schedule 21.03.2017    source источник
comment
Spring Security реализован с использованием фильтров, которые выполняются перед DispatcherServlet и любыми имеющимися у вас контроллерами/обработчиками. Так что конечно не запустится. Реализуйте его с помощью фильтра вместо HandlerInterceptor.   -  person M. Deinum    schedule 21.03.2017
comment
Спасибо за ваш ответ @M.Deinum. Но как только я узнаю, что фильтр не меняет поведение этого метода. Согласно stackoverflow.com/a/35856496/2463802, фильтр хорошо подходит для обработки содержимого запроса и просмотра содержимого, например составного формы и сжатие GZIP. Обычно это показывает, когда нужно сопоставить фильтр с определенными типами контента (например, изображениями) или со всеми запросами.   -  person Marcos Nunes    schedule 21.03.2017
comment
Ваше понимание фильтров ошибочно. То, чего вы хотите достичь, вы не можете достичь с помощью перехватчика обработчика, вы должны использовать фильтр. Фильтр может делать гораздо больше, чем Handlerinterceptor, и, как упоминалось ранее, Spring Security реализован с использованием фильтров, и поэтому HandlerInterceptor просто не вариант.   -  person M. Deinum    schedule 21.03.2017
comment
Большой! Я понял работу и смог решить свою проблему.   -  person Marcos Nunes    schedule 21.03.2017


Ответы (1)


Если у вас такая же проблема, я решил эту проблему, используя фильтр, как предложил @M.Deinum. Я использовал тот же фильтр, что и для проверки токена аутентификации.

person Marcos Nunes    schedule 21.03.2017