70 lines
2.6 KiB
Java
70 lines
2.6 KiB
Java
package net.gepafin.tendermanagement.config;
|
|
|
|
import java.io.IOException;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.security.core.AuthenticationException;
|
|
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
import jakarta.servlet.http.HttpServletResponse;
|
|
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
|
import net.gepafin.tendermanagement.entities.SamlResponseEntity;
|
|
import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum;
|
|
import net.gepafin.tendermanagement.repositories.SamlResponseRepository;
|
|
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
|
|
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
|
|
|
|
@Component
|
|
public class SamlFailureHandler implements AuthenticationFailureHandler {
|
|
|
|
private final Logger logger = LoggerFactory.getLogger(SamlFailureHandler.class);
|
|
|
|
@Value("${fe.base.url}")
|
|
private String feBaseUrl;
|
|
|
|
@Autowired
|
|
private SamlResponseRepository samlResponseRepository;
|
|
|
|
@Override
|
|
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
|
|
AuthenticationException exception) throws IOException {
|
|
try {
|
|
logger.error("SAML login failed: " + exception.getMessage());
|
|
String inResponseTo = extractInResponseTo(feBaseUrl);
|
|
if (Boolean.FALSE.equals(StringUtils.isEmpty(inResponseTo))) {
|
|
SamlResponseEntity samlResponseLogEntity = samlResponseRepository
|
|
.findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue())
|
|
.orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST,
|
|
Translator.toLocale(GepafinConstant.INVALID_REQUEST)));
|
|
samlResponseLogEntity.setStatus(SamlResponseStatusEnum.FAILED.getValue());
|
|
samlResponseRepository.save(samlResponseLogEntity);
|
|
}
|
|
response.sendRedirect(feBaseUrl + "/login");
|
|
} catch (Exception e) {
|
|
logger.error("Error processing SAML failure handler", e);
|
|
}
|
|
}
|
|
|
|
public static String extractInResponseTo(String message) {
|
|
String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-]+)\\]";
|
|
|
|
Pattern pattern = Pattern.compile(regex);
|
|
Matcher matcher = pattern.matcher(message);
|
|
|
|
if (matcher.find()) {
|
|
return matcher.group(1);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
}
|