Как определить тип настраиваемого гранта в клиенте Spring Security Oauth2? - PullRequest
2 голосов
/ 14 января 2020

У меня есть работающее API-шлюз приложение, построенное на spring-boot 2.2 , которое является клиентом Oauth2 , поддерживающим предоставление кода авторизации расход. Он построен с использованием spring-boot @ EnableOAuth2Sso , который создаст весенний сеанс и контекст oauth2 после успешного входа пользователя. Каждый запрос к серверу ресурсов будет перехватываться этим API-шлюзом и проверяет его сеанс пользователя также токен oauth2 из контекста сеанса. Все серверы ресурсов защищены Oauth2.

Мне необходимо поддерживать SAML2 login также через этот шлюз. Я настроил WSO2 в качестве поставщика удостоверений , который предоставляет ответ SAML в виде запроса POST на конечную точку в API-шлюзе после успешного входа пользователя через инициированный IDP поток входа в систему , Прямо сейчас WSO2 IDP может предоставить мне токен Oauth2, когда я отправляю запрос токена с утверждением SAML и типом предоставления SAML. Что мне нужно, это когда запрос SAML POST приходит от IDP WSO2 к шлюзу API, он должен создать токен Oauth2 из WSO2, используя утверждение SAML и тип предоставления SAML, а также создать сеанс Spring и контекст Oauth2 с этим полученным токеном Oauth2.

В настоящий момент у меня есть два возможных варианта:

1) Определить настраиваемый тип предоставления безопасности Oauth2 для пружин в клиенте api-gateway Oauth2 и обработать Ответ SAML для генерации токена Oauth2 с использованием Spring-Security, а также сеанса Spring и контекста Oauth2.

2) Вручную написать код для генерации токена Oauth2 с использованием ответа SAML, а также вручную создать новый сеанс Spring и контекст Oauth2, который будет уродливым подходом.

Ниже приведен текущий класс конфигурации безопасности.

@Configuration
@EnableOAuth2Sso
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String ROOT_PATH = "/";
    private static final String SUFFIX = "**";
    private static final String ANY_OTHER = "/webjars";

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .antMatcher(ROOT_PATH + SUFFIX)
            .authorizeRequests()
              .antMatchers(LOGIN_PATH.value() + SUFFIX, ERROR_PATH.value() + SUFFIX, ANY_OTHER + SUFFIX, "/saml**").permitAll()
              .antMatchers(HttpMethod.POST, "/saml**").permitAll()
            .anyRequest()
              .authenticated()
            .and().csrf().ignoringAntMatchers("/saml**")
            .and().logout().logoutSuccessUrl(LOGOUT_SUCCESS_PATH.value()).permitAll();

        }

        @Bean
        public OAuth2RestOperations restTemplate(OAuth2ClientContext clientContext, OAuth2ProtectedResourceDetails resourceDetails) {
            return new OAuth2RestTemplate(resourceDetails, clientContext);
        }

        @SuppressWarnings({ "rawtypes", "unchecked" })
        @Bean
        public FilterRegistrationBean oauth2ClientFilterRedirectRegistration(OAuth2ClientContextFilter filter) {
          FilterRegistrationBean registration = new FilterRegistrationBean();
          registration.setFilter(filter);
          registration.setOrder(-100);
          return registration;
        }
}

Ниже приведена конфигурация Yml

security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: xxxx
      clientSecret: xxxxx
      accessTokenUri: http://localhost:9763/oauth2/token
      userAuthorizationUri: http://localhost:9763/oauth2/authorize
      scope: openid,email,name
    resource:
      userInfoUri: http://localhost:9763/oauth2/userinfo
      jwk: 
        key-set-uri: http://localhost:9763/oauth2/jwks

Может кто-нибудь подсказать, как мы можем определить пользовательский весенний тип безопасности Oauth2 в клиенте Oauth2? Есть ли доступная документация для настройки того же самого? Поддерживает ли Spring-Security это требование?

Также есть ли другие решения для этого сценария? Любые предложения, пожалуйста.

...