我正在使用 org.opensaml 和 spring-security-saml-service-provider 将 Spring Boot 后端迁移到 Spring Boot 3。一切都按预期进行,但注销很难开始工作。 (RP-发起)
如果我理解正确,根据文档:https://docs.spring.io/spring-security/reference/servlet/saml2/logout.html向端点/saml/logout自动创建的POST具有此配置的 SAML 应创建 SAML 注销请求和 SAML 注销响应(如 SAML 协议中所述)并清除会话(在此示例中是在 Keycloak 上)。
http.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(SamlConfiguration.ERROR_AUTH_LANDING, SamlConfiguration.LOGOUT_AUTH_LANDING).permitAll()
.requestMatchers("/api/public/**", "/api/example/**", "/saml/**", "/logout/**", "/", "/api/user/**").permitAll().requestMatchers(FRONTEND_ROUTES).permitAll().requestMatchers(HttpMethod.OPTIONS).permitAll().requestMatchers(STATIC_RESOURCES).permitAll().requestMatchers(SWAGGER_RESOURCES).permitAll().anyRequest().authenticated())
.saml2Login(saml2 -> saml2.relyingPartyRegistrationRepository(relyingPartyRegistrationRepository)
.loginPage("/saml/login").successHandler(successRedirectHandler)
.failureHandler(samlAuthenticationFailureHandler))
.saml2Logout(Customizer.withDefaults());
Spring Boot 没有执行所有这些操作,而是使用由表单组成的响应做出反应,然后该表单将发送 SAML 请求。但是我无法利用该响应。 有谁知道如何在 Angular 前端处理这个问题?
public logout(): Observable<void> {
const endpoint = `${Endpoint.appBaseUrl}/saml/logout`;
return this.http.get(endpoint, { responseType: 'text' }).pipe(
map(() => {
this.removeToken();
})
);
}
我尝试创建一个 CustomSaml2LogoutSuccessHandler,它实现了一个执行 SAML 注销请求和响应的 LogoutSuccessHandler。然而,这会导致 CORS 错误。所以我认为这不是正确的方法。 我还尝试通过
设置注销服务网址.singleLogoutServiceResponseLocation("{baseUrl}/saml/logout")
但是,这些想法都无法达到启动 SAML 注销请求/响应流程的预期结果。
有人有针对这种情况的解决方案吗?
面对同样的问题,你找到解决方案了吗?