package org.pac4j.saml.logout; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.core.LogoutRequest; import org.pac4j.core.context.WebContext; import org.pac4j.core.logout.LogoutActionBuilder; import org.pac4j.core.redirect.RedirectAction; import org.pac4j.core.util.CommonHelper; import org.pac4j.saml.client.SAML2Client; import org.pac4j.saml.client.SAML2ClientConfiguration; import org.pac4j.saml.context.SAML2MessageContext; import org.pac4j.saml.profile.SAML2Profile; import org.pac4j.saml.sso.SAML2ObjectBuilder; import org.pac4j.saml.sso.SAML2ProfileHandler; import org.pac4j.saml.sso.SAML2ResponseValidator; import org.pac4j.saml.sso.impl.*; import org.pac4j.saml.transport.Pac4jSAMLResponse; /** * Logout action builder for SAML 2. * * @author Jerome Leleu * @since 2.0.0 */ public class SAML2LogoutActionBuilder<U extends SAML2Profile> implements LogoutActionBuilder<U> { protected SAML2ObjectBuilder<LogoutRequest> saml2LogoutObjectBuilder; protected SAML2ProfileHandler<LogoutRequest> logoutProfileHandler; protected SAML2ResponseValidator logoutResponseValidator; private final SAML2Client client; public SAML2LogoutActionBuilder(final SAML2Client client) { CommonHelper.assertNotNull("client", client); this.client = client; final SAML2ClientConfiguration cfg = client.getConfiguration(); this.saml2LogoutObjectBuilder = new SAML2LogoutRequestBuilder(cfg.getDestinationBindingType()); this.logoutResponseValidator = new SAML2LogoutResponseValidator(this.client.getSignatureTrustEngineProvider()); this.logoutProfileHandler = new SAML2LogoutProfileHandler( new SAML2LogoutMessageSender(this.client.getSignatureSigningParametersProvider(), cfg.getDestinationBindingType(), false, cfg.isForceSignRedirectBindingAuthnRequest()), new SAML2WebSSOMessageReceiver(this.logoutResponseValidator)); } @Override public RedirectAction getLogoutAction(final WebContext context, final U currentProfile, final String targetUrl) { final SAML2MessageContext samlContext = this.client.getContextProvider().buildContext(context); final String relayState = this.client.getStateParameter(context); final LogoutRequest logoutRequest = this.saml2LogoutObjectBuilder.build(samlContext); this.logoutProfileHandler.send(samlContext, logoutRequest, relayState); final Pac4jSAMLResponse adapter = samlContext.getProfileRequestContextOutboundMessageTransportResponse(); if (this.client.getConfiguration().getDestinationBindingType().equalsIgnoreCase(SAMLConstants.SAML2_POST_BINDING_URI)) { final String content = adapter.getOutgoingContent(); return RedirectAction.success(content); } final String location = adapter.getRedirectUrl(); return RedirectAction.redirect(location); } }