Spring Security SAML. Как динамически указать IDP для разных сред? - PullRequest
0 голосов
/ 24 апреля 2020

Я использую библиотеку spring-security-saml2-core: 2.0.0.M31 для интеграции с провайдером идентификации SAML (ADFS). Я приказываю настроить конфигурацию saml. Я использую конфигурационный файл yml, который l ie вместе с исходным кодом.

spring:
  security:
    adfs:
      loging-page: /saml/sp/discovery?idp=http://adfs.blabla.org/adfs/services/trust
    saml2:
      service-provider:
        entity-id: localhost:8080
        alias: adfs-saml
        sign-metadata: true
        sign-requests: true
        want-assertions-signed: true
        single-logout-enabled: true
        name-ids:
          - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
        keys:
          active:
            name: blabla-key
            private-key: |
              -----BEGIN RSA PRIVATE KEY-----
              blabla
              -----END RSA PRIVATE KEY-----
            passphrase: change-it
            certificate: |
              -----BEGIN CERTIFICATE-----
              blabla
              -----END CERTIFICATE-----
        providers:
          - alias: adfs-saml-idp
            metadata: https://adfs.blabla.org/FederationMetadata/2007-06/FederationMetadata.xml
            link-text: Saml ADFS IDP
            name-id: urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
            assertion-consumer-service-index: 0
            authentication-request-binding: urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
            verification-keys:
              - |
                -----BEGIN CERTIFICATE-----
                blabla
                -----END CERTIFICATE-----

В приведенном выше конфигурационном файле у меня указано свойство c для страницы входа в систему. укажите как loginPage конфигурации Spring-Security:

@Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .addFilter(corsFilter)
                .exceptionHandling()
                .accessDeniedHandler(problemSupport)
                .and()
                .cors()
                .and()
                .headers()
                .and()
                .frameOptions()
                .deny()
                .and()
                .requiresChannel()
                .anyRequest()
                .requiresSecure()
                .and()
                .authorizeRequests()
                .antMatchers("/saml/**").permitAll()
                .antMatchers("/**").authenticated()
                .and()
                .formLogin().loginPage(adfsProperties.getLogingPage());
    }

Это работает как прелесть для среды разработки. Но для производственного развертывания мне нужно указать другой IDP с разными ключами.

Я пытаюсь переопределить свойства, используя переменные среды и пружинное связывание (это указывается в конвейере развертывания как переменная среды контейнера)

Я могу сделать это успешно, например, для SPRING_SECURITY_ADFS_LOGIN_PAGE и, например, для SPRING_SECURITY_SAML2_SERVICE_PROVIDER_ENTITY_ID. Но, кажется, весна специально обрабатывает spring.security.saml2.service-provider.providers свойства. И я не могу переопределить, например, свойство SPRING_SECURITY_SAML2_SERVICE_PROVIDER_PROVIDERS_METADATA.

Возможно, использование моего сервера конфигурации или внешнего файла конфигурации .yml для производственного профиля решит мою проблему. Но я хочу понять, как переопределить это с помощью переменных ENV? Может быть, некоторые изменения подходят для переопределения способа инициализации этих свойств в инфраструктуре spring-security-saml2.

Может кто-нибудь помочь, как это сделать?

...