Защита одной и той же конечной точки с несколькими конфигурациями - PullRequest
0 голосов
/ 30 августа 2018

У нас есть микросервисная архитектура с ценными бумагами для прямой и обратной связи с JWT и взаимной защитой с HTTP Basic.

Вот наш класс конфигурации для JWT:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .requestMatchers()
            .antMatchers(endpointsProperties.getJwtWithWildcard())
            .and()
            .csrf().disable()
            .authorizeRequests().anyRequest().authenticated()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
}

jwtFilter - простой фильтр, который читает заголовок авторизации и устанавливает SecurityContextHolder.

И HTTP Basic:

@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
    for (Map<String, String> userData : properties.getUsers()) {
        auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance())
                .withUser(userData.get("login")).password(userData.get("password")).authorities(BASIC_AUTH_AUTHORITY);
    }


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.requestMatchers().antMatchers(endpoints.getBasicWithWildcard() )
            .and().csrf().disable()
            .authorizeRequests().anyRequest().authenticated()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().httpBasic();
}

Эти классы конфигурации используются в разных сервисах с разными конечными точками аутентификации JWT и HTTP. Они используются либо одновременно, либо независимо. EndpointsProperties загружаются из application.yml.

Но теперь у нас есть некоторые ссылочные микросервисы, к которым мы хотим, чтобы другие сервисы или директивы были доступны (веб) веб-приложению. Мы хотим знать, возможно ли защитить один и тот же URL-адрес (например, «/ api / referential») двумя разными методами. Объединение этих классов конфигурации с одинаковыми конечными точками не работает, и кажется, что одна конфигурация стирает другую.

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

Спасибо за вашу поддержку.

1 Ответ

0 голосов
/ 30 августа 2018

Я думаю, вы можете просто добавить два фильтра в цепочку фильтров в этом порядке

  1. BasicAuthenticationFilter
  2. JwtFilter

и убедитесь, что для свойства ignoreFailure BasicAuthenticationFilter установлено значение true.

Это заставит BasicAuthFilter аутентифицировать запросы с basicAuth и просто продолжить по цепочке фильтров, если не отправлено basicAuth - таким образом, делегирование JwtFilter.

затем удалите .httpBasic() из WebsecurityConfig - так как он попытается добавить еще BasicSecurityFilter.

Просто идея без манжеты

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