У меня есть архитектура Microservices, и я обрабатываю CSRF на общем шлюзе (который использует Zuul), который выполняет аутентификацию.
Вот класс SecurityConfig службы шлюза.
@Configuration
@EnableWebSecurity
public class GatewaySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(authenticationProcessingFilter(),
UsernamePasswordAuthenticationFilter.class)
.anyRequest().authenticated().
and().formLogin().loginPage(loginFormUrl).permitAll().and().logout().permitAll().and()
.csrf().ignoringAntMatchers("/authenticate")
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
А вот класс SecurityConfig клиентской службы, которому нужен токен CSRF, установленный в службе шлюза
@Configuration
@EnableWebSecurity
public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().disable().authorizeRequests()
.anyRequest().permitAll().
and().csrf().disable();
}
}
Я отключил CSRF в клиентском приложении, поскольку хочу, чтобы обработка CSRF only была сделано в сервисе Gateway. Однако, когда я пытаюсь получить токен и заголовок на стороне клиента, они все отображаются как неопределенные.
var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");
Однако, когда я включаю csrf в ClientSecurityConfig, генерируется другой токен csrf. Как получить набор токенов CSRF в службе шлюза. Это то, что я пробовал.
Мне известно, что токен CSRF сохраняется в файлах cookie. Однако, когда я пытаюсь получить этого повара ie, используя JS
var cook ie = decodeURIComponent (document.cook ie)
Повар ie не указан в среде HTTPS, поскольку повар ie теперь защищен и не может быть прочитан из сценариев. (Я могу прочитать этот повар ie в обычной среде HTTP)
Есть есть лучший способ обработки управления CSRF в микросервисах или идеальный способ для других служб получить доступ к токену, установленному GatewayService. Я что-то здесь упускаю?