Spring SAML2 Saml2WebSsoAuthenticationФильтр пользовательский обработчик успешной аутентификации

#spring-security #saml

Вопрос:

Я использую код Spring Security v5.5.1 SAML2 для поддержки SAML. У меня есть рабочее решение, использующее более старое расширение Spring security, но я «обновляю».

У меня работают потоки, инициированные SP и инициированные IDP, но я не могу понять, как настроить URL-адрес перенаправления обработчика успеха. По умолчанию используется значение «/». Я не понимаю, как я могу получить доступ Saml2WebSsoAuthenticationFilter и/или SavedRequestAwareAuthenticationSuccessHandler переопределить URL-адрес.

Я установил значение по умолчанию RelayState для IDP, и оно действительно отправляется с утверждениями, но Spring, похоже, его не использует.

Кроме того, используя более старое расширение, я мог бы сохранить запрос SAML в базе данных и получить его, когда придет ответ, так как мое приложение не использует сеансы. Я не нашел способа сделать то же самое здесь.

Вот мой поставщик аутентификации и регистрация сторон ретрансляции, как видно из документов и образцов, которые я нашел:

 OpenSaml4AuthenticationProvider authenticationProvider = new OpenSaml4AuthenticationProvider();
authenticationProvider.setAssertionValidator( OpenSaml4AuthenticationProvider.createDefaultAssertionValidator( assertionToken -> {
                    Map<String, Object> params = new HashMap<>();
                    params.put( CLOCK_SKEW, Duration.ofMinutes(10).toMillis());

                    String recipient = assertionToken.getToken().getRelyingPartyRegistration().getAssertionConsumerServiceLocation();
                    params.put( SAML2AssertionValidationParameters.SC_VALID_RECIPIENTS, Collections.singleton(recipient));

                    String audience = assertionToken.getToken().getRelyingPartyRegistration().getAssertionConsumerServiceLocation();
                    params.put( SAML2AssertionValidationParameters.COND_VALID_AUDIENCES, Collections.singleton( "blah"));

                    return new ValidationContext( params);
                })
        );

Converter<HttpServletRequest, RelyingPartyRegistration> relyingPartyRegistrationResolver =
        new DefaultRelyingPartyRegistrationResolver( relyingPartyRegistrationRepository);

Saml2MetadataFilter filter = new Saml2MetadataFilter(
                relyingPartyRegistrationResolver,
                new OpenSamlMetadataResolver());

http
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
    .authorizeRequests()
    .antMatchers( "/saml2/**").permitAll()
    .antMatchers( "/login/**").permitAll()
    .and()
    .saml2Login( saml2 -> saml2.authenticationManager( new ProviderManager( authenticationProvider)))
    .addFilterBefore( filter, Saml2WebSsoAuthenticationFilter.class);
 
 RelyingPartyRegistration registration = RelyingPartyRegistration
        .withRegistrationId("blah")
        .assertionConsumerServiceLocation( getAssertionRecipient( environment, "blah"))
        .signingX509Credentials( c -> c.add( credentialSp))
        .decryptionX509Credentials( c -> c.add( decryptSp))
        .assertingPartyDetails(party -> party
            .entityId("blah")
            .singleSignOnServiceLocation("https://sso.stuff/samlstuff")
            .wantAuthnRequestsSigned( false)
            .verificationX509Credentials( c -> c.add( credential))
        )
        .build();
 

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

Спасибо!

Комментарии:

1. Можете ли вы показать весь свой configure(HttpSecurity http) метод или SecurityFilterChain фасоль?

2. Отредактировано с добавлениями метода настройки

3. Вы пробовали определить AuthenticationSuccessHandler внутреннюю saml2Login конфигурацию? После успешного входа в систему он должен быть вызван, и вы можете указать URL-адрес, который вы хотите переслать пользователю

4. Я этого даже не заметил! :). Я попробую это сделать.

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

Ответ №1:

Попробуйте что-нибудь подобное, это сработало для меня. .saml2Login( saml2 — > {saml2.AuthenticationManager( новый менеджер-провайдер( поставщик аутентификации); saml2.defaultSuccessUrl(«url») }))