Запрошенный сеанс недействителен. Как исключить конечную точку в SessionManager (безопасность Spring)

#spring #spring-security

Вопрос:

Мое приложение имеет архитектуру микросервиса, есть службы и шлюз (zuul). Спереди все запросы направляются на шлюз, а затем проксируются службе.

У меня есть конечная точка /iam/пользователи/подтверждение, она открыта (не требует авторизации).

Если я отправляю запрос, когда пользователь не авторизован (файл cookie JSESSIONID отсутствует) или авторизован, запрос работает нормально, но если я отправляю запрос по истечении сеанса, я получаю ошибку 401 в шлюзе.

в моей консоли в шлюзе:

 o.a.coyote.http11.Http11InputBuffer      : Received [POST /gateway/iam/users/confirm HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.2
Accept: */*
Host: localhost:9292
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 55
Cookie: JSESSIONID=4696E27D6EE8B9BF05AF820AA0693B8D

{
    "token": "3a330d68-8716-49af-8f93-fce739c95883"
}]

2021-07-14 17:22:50.687 DEBUG 13395 --- [nio-9292-exec-9] o.s.s.w.session.SessionManagementFilter  : Requested session ID 4696E27D6EE8B9BF05AF820AA0693B8D is invalid.
2021-07-14 17:22:50.711 DEBUG 13395 --- [nio-9292-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/* json, application/json, application/* json]
2021-07-14 17:22:50.711 DEBUG 13395 --- [nio-9292-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Wed Jul 14 17:22:50 MSK 2021, status=401, error=Unauthorized, message=No message availabl (truncated)...]
2021-07-14 17:22:50.714 DEBUG 13395 --- [nio-9292-exec-9] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2021-07-14 17:22:50.715 DEBUG 13395 --- [nio-9292-exec-9] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 401
 

Мне нужна помощь в том, как сделать конечную точку /iam/пользователей/подтверждение всегда доступной, независимо от сеанса и авторизации.

WebSecurityConfigurerAdapter.class в шлюзе

     @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
            .authorizeRequests()
                .antMatchers("/audit/**").authenticated()
            .anyRequest().permitAll()
            .and()
            .sessionManagement()
            .sessionAuthenticationFailureHandler(failureHandler())
            .invalidSessionStrategy(invalidSessionStrategy());
        http.addFilterAfter(oAuth2ClientAuthenticationProcessingFilter(), DefaultLoginPageGeneratingFilter.class);
        http.logout().
            logoutUrl("/logout").invalidateHttpSession(true)
            .clearAuthentication(true)
            .deleteCookies("JSESSION")
            .permitAll();
    }
    @Bean
    public InvalidSessionStrategy invalidSessionStrategy() {
        return (request, response) -> {
            Cookie cookieRoot = new Cookie("JSESSIONID", null);
            cookieRoot.setPath("/");
            cookieRoot.setMaxAge(0);
            
            response.addCookie(cookieRoot);
            response.sendRedirect("http://localhost:9000");
        };
    }