Конфигурация нескольких IDP Spring Security SAML2 - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь настроить несколько idps через RelyingPartyRegistrationRepository с использованием Spring Security 5.3. Это моя конфигурация application.yaml

spring:
  security:
    saml2:
      relyingparty:
        registration:
          idpokta:
            identityprovider:
              entity-id: http://<url>
              sso-url: https://<url>
              verification:
                credentials:
                  - certificate-location: "classpath:saml/okta.cert"
              signing:
                credentials:
                  certificate: |
                    -----BEGIN CERTIFICATE-----
                    MIIDpDCC...
                    -----END CERTIFICATE-----
                  private-key: |
                    -----BEGIN PRIVATE KEY-----
                    MIIEvQIBA....

                    -----END PRIVATE KEY-----

          idponelogin:
            identityprovider:
              entity-id: https://<url>
              sso-url: https://<url>
              verification:
                credentials:
                  - certificate-location: "classpath:saml/onelogin.cert"
            signing:
              credentials:
                certificate: |
                  -----BEGIN CERTIFICATE-----
                  MIID/z...
                  -----END CERTIFICATE-----
                private-key: |
                  -----BEGIN PRIVATE KEY-----
                  MIpoi...

                  -----END PRIVATE KEY-----

мой контроллер входа определяется следующим образом:

@Controller
public class LoginController {
    private final RelyingPartyRegistrationRepository relyingParties;

    // ... 

   @GetMapping("/login")
  public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String registrationId = request.getParameter("idp");
    RelyingPartyRegistration relyingParty = this.relyingParties
            .findByRegistrationId(registrationId);
    if (relyingParty == null) {
      response.setStatus(401);
    } else {
      response.sendRedirect("/saml2/authenticate/" + registrationId);
    }
}

ПРОБЛЕМА моя relyingParty имеет данные поставщика, но я думаю, что мой assertionConsumerServiceUrl по умолчанию {baseUrl}/login/saml2/sso/{registrationId} и мой localEntityIdTemplate = {baseUrl} / saml2 / service-provider-metadata / {registrationId } `вызывает проблему. Как мне добавить информацию о sp в мой файл yaml? или я делаю это совершенно неправильно?

Скриншот enter image description here

1 Ответ

0 голосов
/ 29 мая 2020

Я пытался сделать то же самое. API не кажется хорошо продуманным. Если вы попытаетесь использовать функцию автоматической настройки весенней загрузки, единственный способ, который я нашел, - это исключить эту конфигурацию

Saml2RelyingPartyRegistrationConfiguration

и предоставить для этого свой собственный класс.

Поскольку все это локально для пакета , вам нужно перенести почти весь пакет

org.springframework.boot.autoconfigure.security.saml2

в свое собственное приложение, сначала полностью отключив пакет из spring.

В итоге вы получите

CustomRegistrationConfiguredCondition
CustomSaml2LoginConfiguration
CustomSaml2RelyingPartyAutoConfiguration
CustomSaml2RelyingPartyRegistrationConfiguration

по крайней мере. Убедитесь, что ссылки между классами тоже обновлены.

Теперь вам необходимо обновить следующий метод в CustomSaml2RelyingPartyRegistrationConfiguration:

    private RelyingPartyRegistration asRegistration(String id, Registration properties) {
        RelyingPartyRegistration.Builder builder = RelyingPartyRegistration.withRegistrationId(id);
        builder.assertionConsumerServiceUrlTemplate(
                "{baseUrl}" + Saml2WebSsoAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI);
        builder.idpWebSsoUrl(properties.getIdentityprovider().getSsoUrl());
        builder.remoteIdpEntityId(properties.getIdentityprovider().getEntityId());
        builder.localEntityIdTemplate("template_you_like");
        builder.credentials((credentials) -> credentials.addAll(asCredentials(properties)));
        return builder.build();
    }

В качестве альтернативы вы также можете скопировать Saml2RelyingPartyProperties в свой проект и добавьте туда все необходимые поля. Таким образом, вы сможете установить свойства в yaml или файле свойств. Не забудьте использовать эти значения в методе asRegistration, упомянутом выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...