LAPTOP-SB56SG4Q\86185
3 years ago
7 changed files with 321 additions and 1 deletions
@ -1,3 +1,6 @@ |
|||||||
# open-JSD-7889 |
# open-JSD-7889 |
||||||
|
|
||||||
JSD-7889 开源任务材料 |
JSD-7889 开源任务材料\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
@ -0,0 +1,17 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
<plugin> |
||||||
|
<id>com.fr.plugin.third.party.jsd7889</id> |
||||||
|
<name><![CDATA[OA单点登录]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>0.2</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2019-01-01</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[]]></description> |
||||||
|
<change-notes><![CDATA[]]></change-notes> |
||||||
|
<extra-decision> |
||||||
|
<GlobalRequestFilterProvider class="com.fr.plugin.third.party.jsdhiij.http.SessionGlobalRequestFilterProvider"/> |
||||||
|
</extra-decision> |
||||||
|
<function-recorder class="com.fr.plugin.third.party.jsdhiij.http.SessionGlobalRequestFilterProvider"/> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.third.party.jsdhiij.config.DataConfigInitializeMonitor"/> |
||||||
|
</plugin> |
@ -0,0 +1,50 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdhiij; |
||||||
|
|
||||||
|
import java.security.KeyFactory; |
||||||
|
import java.security.PublicKey; |
||||||
|
import java.security.spec.X509EncodedKeySpec; |
||||||
|
import java.util.Base64; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
|
||||||
|
public class RSAEncrypt { |
||||||
|
|
||||||
|
/**Token的Key为FRToken |
||||||
|
* 解析后的内容为Json格式,类似{"UserNo":"W08709","ExpiredTime":"2021-05-31 13:28:19"} |
||||||
|
* 其中UserNo为工号,ExpiredTime为有效时长,若超时,请判官为非法访问 |
||||||
|
* @param args |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static void main(String[] args) throws Exception { |
||||||
|
|
||||||
|
|
||||||
|
String cryToken="XXX"; |
||||||
|
String pubKey="XXX"; |
||||||
|
String decryToken=decryptByPub(cryToken,pubKey); |
||||||
|
System.out.print(decryToken);//输出结果为{"UserNo":"W08709","ExpiredTime":"2021-05-31 13:28:19"}
|
||||||
|
} |
||||||
|
/** |
||||||
|
* RSA私钥解密 |
||||||
|
* |
||||||
|
* @param str |
||||||
|
* 加密字符串 |
||||||
|
* @param publicKey |
||||||
|
* 私钥 |
||||||
|
* @return 铭文 |
||||||
|
* @throws Exception |
||||||
|
* 解密过程中的异常信息 |
||||||
|
*/ |
||||||
|
public static String decryptByPub(String str, String publicKey) throws Exception{ |
||||||
|
//64位解码加密后的字符串
|
||||||
|
byte[] inputByte = Base64.getDecoder().decode(str.getBytes("UTF-8")); |
||||||
|
//base64编码的私钥
|
||||||
|
byte[] decoded = Base64.getDecoder().decode(publicKey); |
||||||
|
PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); |
||||||
|
//RSA解密
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA"); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, pubKey); |
||||||
|
String outStr = new String(cipher.doFinal(inputByte)); |
||||||
|
return outStr; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdhiij.config; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
|
||||||
|
/** |
||||||
|
* 配置数据保存 |
||||||
|
*/ |
||||||
|
@Visualization(category = "单点登录配置") |
||||||
|
public class CustomDataConfig extends DefaultConfiguration { |
||||||
|
public String getNameSpace() { |
||||||
|
return this.getClass().getName(); |
||||||
|
} |
||||||
|
|
||||||
|
private static volatile CustomDataConfig config = null; |
||||||
|
|
||||||
|
public static CustomDataConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(CustomDataConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Identifier(value = "userKey", name = "密钥", description = "", status = Status.SHOW) |
||||||
|
private Conf<String> userKey = Holders.simple("XXX"); |
||||||
|
|
||||||
|
|
||||||
|
public String getUserKey() { |
||||||
|
return userKey.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUserKey(String userKey) { |
||||||
|
this.userKey.set(userKey); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object clone() throws CloneNotSupportedException { |
||||||
|
CustomDataConfig cloned = (CustomDataConfig) super.clone(); |
||||||
|
cloned.userKey = (Conf<String>) userKey.clone(); |
||||||
|
return cloned; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdhiij.config; |
||||||
|
|
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
|
||||||
|
/** |
||||||
|
* 配置信息初始化 |
||||||
|
*/ |
||||||
|
public class DataConfigInitializeMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
CustomDataConfig.getInstance(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,186 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdhiij.http; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.data.NetworkHelper; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.mobile.terminal.TerminalHandler; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.decision.webservice.v10.login.TokenResource; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.intelli.record.Focus; |
||||||
|
import com.fr.intelli.record.Original; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.third.party.jsdhiij.RSAEncrypt; |
||||||
|
import com.fr.plugin.third.party.jsdhiij.config.CustomDataConfig; |
||||||
|
import com.fr.record.analyzer.EnableMetrics; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
@EnableMetrics |
||||||
|
public class SessionGlobalRequestFilterProvider extends AbstractGlobalRequestFilterProvider { |
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "com.fr.plugin.third.party.jsd7889"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{"/decision", "/decision/*"}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Focus(id = "com.fr.plugin.third.party.jsd7889", text = "plugin-jsd-7889", source = Original.PLUGIN) |
||||||
|
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
String fullUrl = getRequestFullUrl(req); |
||||||
|
String method = req.getMethod(); |
||||||
|
LogKit.info("单点登录,记录访问地址:" + method + " " + fullUrl); |
||||||
|
//boolean option = isLogged(req);
|
||||||
|
//if (option) {
|
||||||
|
//filterChain.doFilter(req, res);
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
|
||||||
|
String loginUsername = getUsernameByCookie(req); |
||||||
|
if (StringKit.isEmpty(loginUsername)) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
LogKit.info("单点登录集成,用户名:" + loginUsername ); |
||||||
|
User user = UserService.getInstance().getUserByUserName(loginUsername); |
||||||
|
boolean tipsOption = false; |
||||||
|
if (user == null) { |
||||||
|
tipsOption = true; |
||||||
|
LogKit.info("单点登录集成,用户名:" + loginUsername + "在报表平台不存在"); |
||||||
|
} else if (!user.isEnable()) { |
||||||
|
tipsOption = true; |
||||||
|
LogKit.info("单点登录集成,用户名:" + loginUsername + "在报表平台上被禁用"); |
||||||
|
} |
||||||
|
if (tipsOption) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
String loginToken = LoginService.getInstance().login(req, res, loginUsername); |
||||||
|
req.setAttribute("fine_auth_token", loginToken); |
||||||
|
|
||||||
|
|
||||||
|
filterChain.doFilter(req, res); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error("单点登录出错," + e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized String getUsernameByCookie(HttpServletRequest req) { |
||||||
|
String userId = ""; |
||||||
|
try { |
||||||
|
String frToken = getCookieValue(req, "FRToken"); |
||||||
|
if (StringKit.isEmpty(frToken)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String decryToken = RSAEncrypt.decryptByPub(frToken, CustomDataConfig.getInstance().getUserKey()); |
||||||
|
JSONObject jsonObject = new JSONObject(decryToken); |
||||||
|
userId = jsonObject.getString("UserNo"); |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("单点登录:" + e.getMessage(), e); |
||||||
|
userId = ""; |
||||||
|
} |
||||||
|
return userId; |
||||||
|
} |
||||||
|
|
||||||
|
private String getCookieValue(HttpServletRequest req, String key) { |
||||||
|
Cookie[] cookies = req.getCookies(); |
||||||
|
if ((cookies == null) || (cookies.length <= 0)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
Cookie cookie; |
||||||
|
for (int i = 0, max = cookies.length - 1; i <= max; i++) { |
||||||
|
cookie = cookies[i]; |
||||||
|
if (StringKit.equals(key, cookie.getName())) { |
||||||
|
return cookie.getValue(); |
||||||
|
} |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String getRequestUrl(HttpServletRequest req) { |
||||||
|
String fullUrl = req.getRequestURL().toString(); |
||||||
|
Map<String, String[]> paraMap = req.getParameterMap(); |
||||||
|
String paraName; |
||||||
|
String[] paraValues; |
||||||
|
String loginTypeParaName = "token"; |
||||||
|
String queryStr = ""; |
||||||
|
for (Map.Entry<String, String[]> entry : paraMap.entrySet()) { |
||||||
|
paraName = entry.getKey(); |
||||||
|
if (ComparatorUtils.equals(paraName, loginTypeParaName)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
paraValues = entry.getValue(); |
||||||
|
queryStr = addParaToQuery(queryStr, paraName, paraValues); |
||||||
|
} |
||||||
|
if (StringKit.isEmpty(queryStr)) { |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
fullUrl = fullUrl + "?" + queryStr; |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
|
||||||
|
private String addParaToQuery(String query, String paraName, String[] paraValues) { |
||||||
|
if (StringKit.isEmpty(paraName)) { |
||||||
|
return query; |
||||||
|
} |
||||||
|
String fullQuery = query; |
||||||
|
if ((paraValues == null) || (paraValues.length <= 0)) { |
||||||
|
if (StringKit.isNotEmpty(fullQuery)) { |
||||||
|
fullQuery = fullQuery + "&"; |
||||||
|
} |
||||||
|
fullQuery = paraName + "="; |
||||||
|
return fullQuery; |
||||||
|
} |
||||||
|
for (int i = 0, max = paraValues.length - 1; i <= max; i++) { |
||||||
|
if (StringKit.isNotEmpty(fullQuery)) { |
||||||
|
fullQuery = fullQuery + "&"; |
||||||
|
} |
||||||
|
fullQuery = fullQuery + paraName + "=" + paraValues[i]; |
||||||
|
} |
||||||
|
return fullQuery; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String getRequestFullUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String query = req.getQueryString(); |
||||||
|
if ("null".equalsIgnoreCase(query) || StringKit.isEmpty(query)) { |
||||||
|
query = ""; |
||||||
|
} else { |
||||||
|
query = "?" + query; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString() + query; |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isLogged(HttpServletRequest req) { |
||||||
|
boolean logged = true; |
||||||
|
|
||||||
|
try { |
||||||
|
String token = TokenResource.COOKIE.getToken(req); |
||||||
|
LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, NetworkHelper.getDevice(req))); |
||||||
|
} catch (Exception var4) { |
||||||
|
logged = false; |
||||||
|
} |
||||||
|
|
||||||
|
return logged; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue