SSO
This commit is contained in:
parent
b425cea10c
commit
81db2c0de5
|
@ -0,0 +1,148 @@
|
||||||
|
package shkd.plugin;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
|
import kd.bos.login.thirdauth.ThirdSSOAuthHandler;
|
||||||
|
import kd.bos.login.thirdauth.UserAuthResult;
|
||||||
|
import kd.bos.login.thirdauth.UserProperType;
|
||||||
|
import kd.bos.login.utils.StringUtils;
|
||||||
|
import kd.bos.util.RevProxyUtil;
|
||||||
|
import org.jasig.cas.client.Protocol;
|
||||||
|
import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy;
|
||||||
|
import org.jasig.cas.client.authentication.DefaultAuthenticationRedirectStrategy;
|
||||||
|
import org.jasig.cas.client.util.CommonUtils;
|
||||||
|
import org.jasig.cas.client.validation.Assertion;
|
||||||
|
import org.jasig.cas.client.validation.Cas10TicketValidator;
|
||||||
|
|
||||||
|
public class SSOLoginPugin implements ThirdSSOAuthHandler {
|
||||||
|
private static Log logger = LogFactory.getLog(SSOLoginPugin.class);
|
||||||
|
private final Protocol protocol;
|
||||||
|
private String serverName;
|
||||||
|
private String service;
|
||||||
|
private boolean encodeServiceUrl;
|
||||||
|
private String casSeverLoginUrl;
|
||||||
|
Cas10TicketValidator ticketValidator;
|
||||||
|
private AuthenticationRedirectStrategy authenticationRedirectStrategy;
|
||||||
|
|
||||||
|
public SSOLoginPugin() {
|
||||||
|
this.protocol = Protocol.CAS1;
|
||||||
|
this.encodeServiceUrl = true;
|
||||||
|
this.authenticationRedirectStrategy = new DefaultAuthenticationRedirectStrategy();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 该方法是用户没有登录的时候插件需要转移到正确的登录地址
|
||||||
|
public void callTrdSSOLogin(HttpServletRequest request, HttpServletResponse response, String backUrl) {
|
||||||
|
this.initialServiceData(request);
|
||||||
|
if (this.casSeverLoginUrl == null) {
|
||||||
|
this.casSeverLoginUrl = this.initCasLoginUrl();
|
||||||
|
}
|
||||||
|
|
||||||
|
String urlToRedirectTo = "";
|
||||||
|
String path = request.getRequestURI();
|
||||||
|
if (path.contains("/auth/logout.do")) {
|
||||||
|
urlToRedirectTo = StringUtils.getPathString(this.casSeverLoginUrl) + "logout?service=" + RevProxyUtil.getURLContextPath(request);
|
||||||
|
} else {
|
||||||
|
String serviceUrl = this.constructServiceUrl(request, response);
|
||||||
|
logger.debug(String.format("Constructed service url: %s", serviceUrl));
|
||||||
|
urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casSeverLoginUrl, this.getProtocol().getServiceParameterName(), serviceUrl, false, false, (String) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug(String.format("redirecting to \"%s\"", urlToRedirectTo));
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.authenticationRedirectStrategy.redirect(request, response, urlToRedirectTo);
|
||||||
|
} catch (IOException var7) {
|
||||||
|
var7.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String initCasLoginUrl() {
|
||||||
|
String configLoginUrl = System.getProperty("cas.sso.ca10.loginurl");
|
||||||
|
if (configLoginUrl == null) {
|
||||||
|
logger.error("没有配置 sso 登录cas.sso.ca10.loginurl");
|
||||||
|
}
|
||||||
|
|
||||||
|
return configLoginUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 该方法实现第三发插件认证及认证结果的返回
|
||||||
|
public UserAuthResult getTrdSSOAuth(HttpServletRequest request, HttpServletResponse response) {
|
||||||
|
UserAuthResult result = new UserAuthResult();
|
||||||
|
result.setSucess(false);
|
||||||
|
result.setUserType(UserProperType.UserName);
|
||||||
|
this.initialServiceData(request);
|
||||||
|
if (this.casSeverLoginUrl == null) {
|
||||||
|
this.casSeverLoginUrl = this.initCasLoginUrl();
|
||||||
|
}
|
||||||
|
|
||||||
|
String ticket = this.retrieveTicketFromRequest(request);
|
||||||
|
if (CommonUtils.isNotBlank(ticket)) {
|
||||||
|
try {
|
||||||
|
logger.debug(String.format("Attempting to validate ticket: %s", ticket));
|
||||||
|
if (this.ticketValidator == null) {
|
||||||
|
this.ticketValidator = new Cas10TicketValidator(this.casSeverLoginUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
String userName = null;
|
||||||
|
Assertion assertion = this.ticketValidator.validate(ticket, this.constructServiceUrl(request, response));
|
||||||
|
logger.debug(String.format("Successfully authenticated user: %s", assertion.getPrincipal().getName()));
|
||||||
|
if (assertion != null) {
|
||||||
|
userName = assertion.getPrincipal().getName();
|
||||||
|
result.setUser(userName);
|
||||||
|
result.setSucess(true);
|
||||||
|
}
|
||||||
|
} catch (Exception var7) {
|
||||||
|
logger.error(var7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialServiceData(HttpServletRequest request) {
|
||||||
|
if (this.serverName == null) {
|
||||||
|
this.serverName = RevProxyUtil.getURLContextPath(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.service == null) {
|
||||||
|
this.service = this.serverName + "index.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final String constructServiceUrl(HttpServletRequest request, HttpServletResponse response) {
|
||||||
|
return CommonUtils.constructServiceUrl(request, response, this.service, this.serverName, this.protocol.getServiceParameterName(), this.protocol.getArtifactParameterName(), this.encodeServiceUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setServerName(String serverName) {
|
||||||
|
if (serverName != null && serverName.endsWith("/")) {
|
||||||
|
this.serverName = serverName.substring(0, serverName.length() - 1);
|
||||||
|
logger.info(String.format("Eliminated extra slash from serverName [%s]. It is now [%s]", serverName, this.serverName));
|
||||||
|
} else {
|
||||||
|
this.serverName = serverName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setService(String service) {
|
||||||
|
this.service = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setEncodeServiceUrl(boolean encodeServiceUrl) {
|
||||||
|
this.encodeServiceUrl = encodeServiceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Protocol getProtocol() {
|
||||||
|
return this.protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String retrieveTicketFromRequest(HttpServletRequest request) {
|
||||||
|
return CommonUtils.safeGetParameter(request, this.protocol.getArtifactParameterName(), Arrays.asList(this.protocol.getArtifactParameterName()));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue