#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») }))