LAPTOP-SB56SG4Q\86185
3 years ago
8 changed files with 312 additions and 1 deletions
Binary file not shown.
@ -1,3 +1,6 @@
|
||||
# open-JSD-9103 |
||||
|
||||
JSD-9103 4A单点集成 |
||||
JSD-9103 4A单点集成\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||
<id>com.eco.plugin.xxxx.ticket.login</id> |
||||
<name><![CDATA[移动端认证插件]]></name> |
||||
<active>yes</active> |
||||
<version>1.0.0</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2020-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[移动端认证插件]]></description> |
||||
<change-notes><![CDATA[ |
||||
]]></change-notes> |
||||
<extra-decision> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.TKloginFilter"/> |
||||
</extra-decision> |
||||
<function-recorder class="com.fr.plugin.TKloginFilter"/> |
||||
</plugin> |
@ -0,0 +1,70 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fr.config.*; |
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
|
||||
@Visualization(category = "OAUTH2插件配置") |
||||
public class TKConfig extends DefaultConfiguration { |
||||
|
||||
private static volatile TKConfig config = null; |
||||
|
||||
public static TKConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(TKConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
@Identifier(value = "valAddr", name = "接口地址", description = "接口地址", status = Status.SHOW) |
||||
private Conf<String> valAddr = Holders.simple(""); |
||||
@Identifier(value = "frUrl", name = "报表地址", description = "报表地址", status = Status.SHOW) |
||||
private Conf<String> frUrl = Holders.simple("http://localhost:8075/webroot/decision"); |
||||
@Identifier(value = "appId", name = "clientId", description = "clientId", status = Status.HIDE) |
||||
private Conf<String> appId = Holders.simple(""); |
||||
@Identifier(value = "clientSecret", name = "clientSecret", description = "clientSecret", status = Status.HIDE) |
||||
private Conf<String> clientSecret = Holders.simple(""); |
||||
|
||||
public String getFrUrl() { |
||||
return frUrl.get(); |
||||
} |
||||
|
||||
public void setFrUrl(String frUrl) { |
||||
this.frUrl.set(frUrl); |
||||
} |
||||
|
||||
public String getAppId() { |
||||
return appId.get(); |
||||
} |
||||
|
||||
public void setAppId(String appId) { |
||||
this.appId.set(appId); |
||||
} |
||||
|
||||
public String getClientSecret() { |
||||
return clientSecret.get(); |
||||
} |
||||
|
||||
public void setClientSecret(String clientSecret) { |
||||
this.clientSecret.set(clientSecret); |
||||
} |
||||
|
||||
public String getValAddr() { |
||||
return valAddr.get(); |
||||
} |
||||
|
||||
public void setValAddr(String valAddr) { |
||||
this.valAddr.set(valAddr); |
||||
} |
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
TKConfig cloned = (TKConfig) super.clone(); |
||||
cloned.valAddr = (Conf<String>) valAddr.clone(); |
||||
cloned.appId = (Conf<String>) appId.clone(); |
||||
cloned.clientSecret = (Conf<String>) clientSecret.clone(); |
||||
cloned.frUrl = (Conf<String>) frUrl.clone(); |
||||
return cloned; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,211 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fanruan.api.net.http.HttpKit; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.fun.Authorize; |
||||
import com.fr.third.org.apache.http.HttpEntity; |
||||
import com.fr.third.org.apache.http.HttpResponse; |
||||
import com.fr.third.org.apache.http.NameValuePair; |
||||
import com.fr.third.org.apache.http.client.HttpClient; |
||||
import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; |
||||
import com.fr.third.org.apache.http.client.methods.HttpPost; |
||||
import com.fr.third.org.apache.http.conn.scheme.Scheme; |
||||
import com.fr.third.org.apache.http.conn.ssl.SSLSocketFactory; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClientBuilder; |
||||
import com.fr.third.org.apache.http.message.BasicNameValuePair; |
||||
import com.fr.third.org.apache.http.util.EntityUtils; |
||||
import com.fr.web.utils.WebUtils; |
||||
import org.dom4j.Document; |
||||
import org.dom4j.DocumentException; |
||||
import org.dom4j.Element; |
||||
import org.dom4j.io.SAXReader; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.FilterConfig; |
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.*; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.security.KeyStore; |
||||
import java.util.*; |
||||
|
||||
@FunctionRecorder(localeKey = "fds") |
||||
@Authorize(callSignKey = "com.eco.plugin.xxxx.ticket.login") |
||||
public class TKloginFilter extends AbstractGlobalRequestFilterProvider { |
||||
@Override |
||||
public String filterName() { |
||||
return "ticketCheck"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
return new String[]{ |
||||
"/*" |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void init(FilterConfig filterConfig) { |
||||
TKConfig.getInstance(); |
||||
super.init(filterConfig); |
||||
} |
||||
|
||||
private String getUuid() { |
||||
String uuid = UUID.randomUUID().toString().replace("-", ""); |
||||
return uuid; |
||||
} |
||||
|
||||
public static String getIp(HttpServletRequest req) { |
||||
String realIp = req.getHeader("X-Real-IP"); |
||||
String fw = req.getHeader("X-Forwarded-For"); |
||||
if (StringUtils.isNotEmpty(fw) && !"unKnown".equalsIgnoreCase(fw)) { |
||||
int var3 = fw.indexOf(","); |
||||
return var3 != -1 ? fw.substring(0, var3) : fw; |
||||
} else { |
||||
fw = realIp; |
||||
if (StringUtils.isNotEmpty(realIp) && !"unKnown".equalsIgnoreCase(realIp)) { |
||||
return realIp; |
||||
} else { |
||||
if (StringUtils.isBlank(realIp) || "unknown".equalsIgnoreCase(realIp)) { |
||||
fw = req.getHeader("Proxy-Client-IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("WL-Proxy-Client-IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("HTTP_CLIENT_IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("HTTP_X_FORWARDED_FOR"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getRemoteAddr(); |
||||
} |
||||
|
||||
return fw; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
@ExecuteFunctionRecord |
||||
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { |
||||
try { |
||||
if (needFilter(request) && !isLogin(request)) { |
||||
if (PluginContexts.currentContext().isAvailable()) { |
||||
String ticket = request.getParameter("ticket"); |
||||
TKConfig tkConfig = TKConfig.getInstance(); |
||||
String ip = getIp(request); |
||||
String url = String.format("%s/sso?method=qryUserByTicket", tkConfig.getValAddr()); |
||||
HashMap<String, Object> objectHashMap = new HashMap<>(); |
||||
objectHashMap.put("ticket", ticket); |
||||
objectHashMap.put("clientIp", ip); |
||||
String post = HttpKit.post(url, objectHashMap); |
||||
FineLoggerFactory.getLogger().error("请求:{} ,post response:{}", url, post); |
||||
String username = getAccountFromXML(post); |
||||
User user = UserService.getInstance().getUserByUserName(username); |
||||
if (user == null) { |
||||
WebUtils.printAsString(httpServletResponse, "用户 :" + username + " 在帆软系统中不存在,请联系管理员添加"); |
||||
return; |
||||
} |
||||
login(request, httpServletResponse, username); |
||||
} else { |
||||
WebUtils.printAsString(httpServletResponse, "当前单点登录插件授权过期"); |
||||
return; |
||||
} |
||||
} |
||||
filterChain.doFilter(request, httpServletResponse); |
||||
} catch (IOException | ServletException e) { |
||||
printException2FrLog(e); |
||||
} catch (Exception e) { |
||||
printException2FrLog(e); |
||||
} |
||||
} |
||||
|
||||
private String login(HttpServletRequest req, HttpServletResponse res, String username) throws Exception { |
||||
String token = LoginService.getInstance().login(req, res, username); |
||||
req.setAttribute("fine_auth_token", token); |
||||
FineLoggerFactory.getLogger().info("fr FrFilter is over with username is ###" + username); |
||||
return token; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* <SSO> |
||||
* <RESULT>1</RESULT> |
||||
* <RESULT_MSG>成功</RESULT_MSG> |
||||
* <RESULT_MSGCODE>1000</RESULT_MSGCODE> |
||||
* <ACCOUNT>test</ACCOUNT> |
||||
* <TICKET>xxxxx</TICKET> |
||||
* </SSO> |
||||
* |
||||
* @param xml |
||||
* @return |
||||
*/ |
||||
private static String getAccountFromXML(String xml) throws DocumentException { |
||||
//1.创建Reader对象
|
||||
SAXReader reader = new SAXReader(); |
||||
//2.加载xml
|
||||
Document document = reader.read(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); |
||||
//3.获取根节点
|
||||
Element rootElement = document.getRootElement(); |
||||
Iterator iterator = rootElement.elementIterator(); |
||||
while (iterator.hasNext()) { |
||||
Element stu = (Element) iterator.next(); |
||||
if (StringUtils.equals(stu.getName(), "ACCOUNT")) { |
||||
return stu.getText(); |
||||
} |
||||
} |
||||
return ""; |
||||
} |
||||
|
||||
|
||||
private boolean needFilter(HttpServletRequest request) { |
||||
String requestURI = request.getRequestURI(); |
||||
String ticket = request.getParameter("ticket"); |
||||
if (StringUtils.isNotBlank(requestURI) && request.getMethod().equals("GET") && StringUtils.isNotBlank(ticket)) { |
||||
if (requestURI.endsWith("decision")) { |
||||
return true; |
||||
} |
||||
if (requestURI.endsWith("decision/url/mobile")) { |
||||
return true; |
||||
} |
||||
if (requestURI.endsWith("/view/form") || requestURI.endsWith("/view/report")) { |
||||
if (StringUtils.isNotBlank(request.getParameter("viewlet"))) { |
||||
return true; |
||||
} |
||||
} |
||||
if (requestURI.contains("/v10/entry/access/") && request.getMethod().equals("GET")) { |
||||
return true; |
||||
} |
||||
if (requestURI.contains("/v5/design/report") && (requestURI.endsWith("/edit") || requestURI.endsWith("/view"))) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static void printException2FrLog(Throwable e) { |
||||
StringWriter writer = new StringWriter(); |
||||
e.printStackTrace(new PrintWriter(writer)); |
||||
String s = writer.toString(); |
||||
FineLoggerFactory.getLogger().error("错误:{}", s); |
||||
} |
||||
|
||||
private boolean isLogin(HttpServletRequest req) { |
||||
return LoginService.getInstance().isLogged(req); |
||||
} |
||||
} |
Loading…
Reference in new issue