@Component
@Slf4j
public class SsoInterceptor extends HandlerInterceptorAdapter {
private static final String FALSE = Boolean.FALSE;
@Autowired
private SsoService ssoService;
@Autowired
private SsoAuthService ssoAuthService;
@Value("${sso._use_switch:true}")
private String useSwitch;
public SsoInterceptor() {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if ("false".equals(this.useSwitch)) {
return true;
} else if (!(handler instanceof HandlerMethod)) {
return true;
} else {
HandlerMethod method = (HandlerMethod)handler;
boolean loginRequired = method.getMethodAnnotation(LoginRequired.class) != null || AnnotationUtils.findAnnotation(method.getBean().getClass(), LoginRequired.class) != null;
if (!loginRequired) {
return true;
} else {
String ticket = CookieUtil.getValue(request, "_user_sso_ticket");
boolean checkTicket;
if (StringUtils.isNotEmpty(ticket)) {
checkTicket = this.ssoService.checkTicket(ticket);
if (checkTicket) {
User user = this.getUserInfo(ticket, request, response);
if (Objects.isNull(user)) {
return false;
}
UserUtil.setUser(user);
return true;
}
log.error("check ticket fail");
} else {
log.error("ticket is null ");
}
checkTicket = this.checkCode(request, response);
return checkTicket;
}
}
}
private void redirectLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
String referer = request.getHeader("referer");
String loginUrl = this.ssoService.getLoginUrl(referer);
log.debug("redirect to sso login, loginUrl:{}", loginUrl);
JSONObject jsonObject = new JSONObject();
jsonObject.put("loginUrl", loginUrl);
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType("application/json");
response.getOutputStream().print(jsonObject.toJSONString());
}
private boolean checkCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
String code = request.getParameter("code");
if (StringUtils.isEmpty(code)) {
log.debug("request param, code is null");
this.redirectLogin(request, response);
return false;
} else {
JSONObject data = this.ssoService.checkCode(code);
if (Objects.isNull(data)) {
log.error("get ticket by code from sso system error, ticket is null");
this.redirectLogin(request, response);
return false;
} else {
String ticket = data.getString("ticket");
String ldap = data.getString("username");
log.debug("get ticket by code from sso system success,ticket:{},ldap:{}", ticket, ldap);
CookieUtil.addCookie(response, "_user_sso_ticket", ticket, -1);
CookieUtil.addCookie(response, "_user_sso_ldap", ldap, -1);
User user = this.getUserInfo(ticket, request, response);
if (Objects.isNull(user)) {
return false;
} else {
request.getSession().setAttribute("_user_sso_user", user);
request.getSession().setAttribute("_user_sso_ldap", ldap);
return true;
}
}
}
}
private User getUserInfo(String ticket, HttpServletRequest request, HttpServletResponse response) throws IOException {
User user = this.ssoAuthService.getUserInfo(ticket);
if (Objects.isNull(user)) {
log.error("get userInfo by ticket error, ticket:{}", ticket);
this.redirectLogin(request, response);
return null;
} else {
UserUtil.setUser(user);
return user;
}
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserUtil.clear();
}
}