#java #spring #spring-boot #spring-security
Вопрос:
У меня проблемы с доступом на основе ролей безопасности Spring. У меня есть две услуги:
- услуга А
- служба B, которая извлекает данные из службы A
Оба они имеют такую конфигурацию:
@Configuration @RequiredArgsConstructor public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final ObjectMapper objectMapper; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf() .disable() .authorizeRequests() .antMatchers("/some-servie-api-pattern/**") .hasRole("USER_A") .antMatchers("/whitelisted-api/**") .permitAll() .and() .addFilterBefore(new SecurityFilter(objectMapper), BasicAuthenticationFilter.class); } }
SecurityFilter
считывает роли в строке из заголовка like "USER_C, USER_A"
и создает аутентификацию с SimpleGrantedAuthoirty
помощью (по одной для каждой роли из заголовка). И затем:
- когда я вызываю напрямую сервис API с заголовком
"USER_C, USER_A"
, все работает нормально - когда я вызываю API службы B, я получаю 403 от службы A. Когда я переупорядочиваю роли в заголовке
"USER_A, USER_C"
, он снова работает нормально.
Может ли кто-нибудь помочь в случае вызова службы A через службу B и получения запрета?
ИЗМЕНИТЬ: Моя родительская версия spring boot-2.2.6.РЕЛИЗ. Что я заметил SecurityExpressionRoot
, так это то, что при вызове hasAnyAuthorityMethod
оператора loop in roleSet.contains(defaultedRole)
возвращает false для значения отправленного заголовка, равного "USER_C, USER_A"
, и true, когда значение отправленного заголовка равно "USER_A, USER_C"