*/
public void processLogout(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
if (requiresLogout(request, response)) {
SAMLMessageContext context;
try {
log.debug("Processing SAML logout message");
context = contextProvider.getLocalEntity(request, response);
context.setCommunicationProfileId(getProfileName());
processor.retrieveMessage(context);
context.setLocalEntityEndpoint(SAMLUtil.getEndpoint(context.getLocalEntityRoleMetadata().getEndpoints(), context.getInboundSAMLBinding(), context.getInboundMessageTransport()));
} catch (SAMLException e) {
logger.debug("Incoming SAML message is invalid", e);
throw new ServletException("Incoming SAML message is invalid", e);
} catch (MetadataProviderException e) {
logger.debug("Error determining metadata contracts", e);
throw new ServletException("Error determining metadata contracts", e);
} catch (MessageDecodingException e) {
logger.debug("Error decoding incoming SAML message", e);
throw new ServletException("Error decoding incoming SAML message", e);
} catch (org.opensaml.xml.security.SecurityException e) {
logger.debug("Incoming SAML message failed security validation", e);
throw new ServletException("Incoming SAML message failed security validation", e);
}
if (context.getInboundSAMLMessage() instanceof LogoutResponse) {
try {
logoutProfile.processLogoutResponse(context);
log.debug("Performing local logout after receiving logout response from {}", context.getPeerEntityId());
super.doFilter(request, response, chain);
samlLogger.log(SAMLConstants.LOGOUT_RESPONSE, SAMLConstants.SUCCESS, context);
} catch (Exception e) {
log.debug("Received logout response is invalid", e);
samlLogger.log(SAMLConstants.LOGOUT_RESPONSE, SAMLConstants.FAILURE, context, e);
}
} else if (context.getInboundSAMLMessage() instanceof LogoutRequest) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
SAMLCredential credential = null;
if (auth != null) {
credential = (SAMLCredential) auth.getCredentials();
}
try {
boolean doLogout;
try {
doLogout = logoutProfile.processLogoutRequest(context, credential);
} catch (SAMLStatusException e) {
log.debug("Received logout request is invalid, responding with error", e);
logoutProfile.sendLogoutResponse(context, e.getStatusCode(), e.getStatusMessage());
samlLogger.log(SAMLConstants.LOGOUT_REQUEST, SAMLConstants.FAILURE, context, e);
return;
}
if (doLogout) {
log.debug("Performing local logout after receiving logout request from {}", context.getPeerEntityId());
for (LogoutHandler handler : handlers) {
handler.logout(request, response, auth);
}
}