spring clould oauth2 перенаправляет на "/" после входа в систему с облачным шлюзом Spring - PullRequest
0 голосов
/ 01 августа 2020

Я новичок на весну oauth2. С проверкой документа я выполняю простую функцию для oauth2 в среде Spring Cloud alibaba nacos.

В проекте я хочу добавить перенаправление для запроса oauth от шлюза к микросервису auth. Затем авторизуйтесь микросервисом auth с помощью формы входа и авторизуйте область действия, затем перенаправьте на URL-адрес перенаправления, указанный в URL-адресе oauth.

При прямом запросе на микросервис auth он работает хорошо. Но если отправить запрос на шлюз, после входа в систему он будет перенаправлен в направлении «/» и вызовет ошибку 404.

При исследовании SavedRequestAwareAuthenticationSuccessHandler я обнаружил, что сеанс, содержащийся в запросе, имеет значение null . Более того, я проверяю HttpSessionRequestCache , он также получает нулевой сеанс при сохранении запроса. Поскольку запрос не сохраняется, он не может перенаправить на исходный URL-адрес после входа в систему и перенаправить на URL-адрес по умолчанию "/".

Но я не знаю, почему сеанс, связанный с запросом, пуст. Я также пытаюсь сделать демонстрационный проект, например:

    @RequestMapping(value = "hello",method = RequestMethod.GET)
    public RedirectView hello(HttpServletRequest request){
        System.out.println("Hello:"+request.getSession().getId());
        return new RedirectView("thanks");
    }

    @RequestMapping(value = "thanks",method = RequestMethod.GET)
    public ResponseEntity<String> thanks(HttpServletRequest request){
        System.out.println("Thanks:"+request.getSession().getId());
        return new ResponseEntity("aaa",HttpStatus.OK);
    }

При использовании шлюза напечатанные идентификаторы сеанса отличаются. Но без шлюза они такие же. Ниже приведены настройки моего шлюза:

server:
  port: 8080

spring:
  application:
    name: flower-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: order-routes
          uri: lb://flower-order
          predicates:
            - Path=/order/**
        - id: core-routes
          uri: lb://flower-core
          predicates:
            - Path=/**
        - id: auth-routes
          uri: lb://flower-auth
          predicates:
            - Path=/oauth/**

Итак, я предполагаю, что это вызвано весенним облачным шлюзом. Но я не знаю, как это исправить. Пожалуйста, дайте мне некоторую информацию. Спасибо.

Новые обновления:

Когда я меняю шлюз аутентификации на

- id: auth-routes
          uri: https://127.0.0.1:8082
          predicates:
            - Path=/oauth/**

, он проходит нормальное поведение. Значит ли это, что это вызвано балансировкой нагрузки. Но поскольку у меня всего одна работающая сущность, я не совсем уверен. Означает ли это, что следует использовать управление сеансом распространения, например весенний сеанс? Как и в реальной производственной среде, служба аутентификации не будет иметь только одну сущность.

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете создать обработчик успешной аутентификации. Например, есть один под названием RedirectServerAuthenticationSuccessHandler (одна из реализаций ServerAuthenticationSuccessHandler).

Он перенаправляет исходный URL-адрес (так, первый запрашиваемый URL-адрес перед входом в систему), если кеш запроса имеет перенаправляющий URI. В противном случае выполняется перенаправление на указанный вами URL.

Пример конфигурации

@EnableWebFluxSecurity
public class GatewaySecurityConfiguration {

    @Value("${redirect.url}")
    private String redirectFrontendAddress;

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
                ...
                .oauth2Login()
                .authenticationSuccessHandler(new RedirectServerAuthenticationSuccessHandler(redirectFrontendAddress))
                
                ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...