pioneer
2 years ago
commit
a4cd622966
21 changed files with 1719 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
# open-JSD-9787 |
||||||
|
|
||||||
|
JSD-9787 用户同步和单点\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,27 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
<plugin> |
||||||
|
<id>com.fr.plugin.paila.sync</id> |
||||||
|
<name><![CDATA[用户同步和单点]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.2.1</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2018-03-10</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[用户同步和单点]]></description> |
||||||
|
<function-recorder class="com.fr.plugin.PLFunction"/> |
||||||
|
<change-notes> |
||||||
|
<![CDATA[ |
||||||
|
<p>[2022-03-12]项目启动</p> |
||||||
|
]]> |
||||||
|
</change-notes> |
||||||
|
<main-package>com.fr.plugin</main-package> |
||||||
|
<!--插件生命周期接口--> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.PLLifeCycleMonitor"/> |
||||||
|
<extra-decision> |
||||||
|
<!--插件注入HttpHandler--> |
||||||
|
<HttpHandlerProvider class="com.fr.plugin.PLHttpHander"/> |
||||||
|
<URLAliasProvider class="com.fr.plugin.PLUrlAliasProvider"/> |
||||||
|
<GlobalRequestFilterProvider class="com.fr.plugin.PLFilter"/> |
||||||
|
</extra-decision> |
||||||
|
</plugin> |
||||||
|
|
@ -0,0 +1,99 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.spec.IvParameterSpec; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
import java.util.Base64; |
||||||
|
|
||||||
|
|
||||||
|
public class Aesutils { |
||||||
|
|
||||||
|
private String sKey = "pcycTTYNUJnhlkjh";//key,可自行修改
|
||||||
|
private String ivParameter = "1356039203753300";//偏移量,可自行修改
|
||||||
|
private static Aesutils instance = null; |
||||||
|
|
||||||
|
private Aesutils() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static Aesutils getInstance() { |
||||||
|
if (instance == null) |
||||||
|
instance = new Aesutils(); |
||||||
|
return instance; |
||||||
|
} |
||||||
|
|
||||||
|
public static String Encrypt(String encData ,String secretKey,String vector) throws Exception { |
||||||
|
|
||||||
|
if(secretKey == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if(secretKey.length() != 16) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); |
||||||
|
byte[] raw = secretKey.getBytes(); |
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
||||||
|
IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); |
||||||
|
byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8")); |
||||||
|
return new String(Base64.getEncoder().encode(encrypted)) ;// 此处使用BASE64做转码。
|
||||||
|
} |
||||||
|
|
||||||
|
// 加密
|
||||||
|
public String encrypt(String sSrc) throws Exception { |
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); |
||||||
|
byte[] raw = sKey.getBytes(); |
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); |
||||||
|
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); |
||||||
|
return new String(Base64.getEncoder().encode(encrypted));// 此处使用BASE64做转码。
|
||||||
|
} |
||||||
|
|
||||||
|
// 解密
|
||||||
|
public String decrypt(String sSrc) throws Exception { |
||||||
|
try { |
||||||
|
byte[] raw = sKey.getBytes("ASCII"); |
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); |
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes()); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); |
||||||
|
byte[] encrypted1 = Base64.getDecoder().decode(sSrc);// 先用base64解密
|
||||||
|
byte[] original = cipher.doFinal(encrypted1); |
||||||
|
String originalString = new String(original, "utf-8"); |
||||||
|
return originalString; |
||||||
|
} catch (Exception ex) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String decrypt(String sSrc,String key,String ivs) throws Exception { |
||||||
|
try { |
||||||
|
byte[] raw = key.getBytes("ASCII"); |
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); |
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivs.getBytes()); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); |
||||||
|
byte[] encrypted1 = Base64.getDecoder().decode(sSrc);// 先用base64解密
|
||||||
|
byte[] original = cipher.doFinal(encrypted1); |
||||||
|
String originalString = new String(original, "utf-8"); |
||||||
|
return originalString; |
||||||
|
} catch (Exception ex) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static String encodeBytes(byte[] bytes) { |
||||||
|
StringBuffer strBuf = new StringBuffer(); |
||||||
|
|
||||||
|
for (int i = 0; i < bytes.length; i++) { |
||||||
|
strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a'))); |
||||||
|
strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a'))); |
||||||
|
} |
||||||
|
|
||||||
|
return strBuf.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.json.JSONObject; |
||||||
|
|
||||||
|
import javax.net.ssl.*; |
||||||
|
import javax.xml.bind.DatatypeConverter; |
||||||
|
import java.io.*; |
||||||
|
import java.net.HttpURLConnection; |
||||||
|
import java.net.URL; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.security.cert.CertificateException; |
||||||
|
import java.security.cert.X509Certificate; |
||||||
|
|
||||||
|
public class HttpUtils { |
||||||
|
public static String inputStream2String(InputStream inputStream) { |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
BufferedReader reader = null; |
||||||
|
|
||||||
|
try { |
||||||
|
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset())); |
||||||
|
String line; |
||||||
|
while ((line = reader.readLine()) != null) { |
||||||
|
sb.append(line); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} finally { |
||||||
|
if (reader != null) { |
||||||
|
try { |
||||||
|
reader.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
static class MyX509TrustManager implements X509TrustManager { |
||||||
|
|
||||||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
} |
||||||
|
|
||||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
} |
||||||
|
|
||||||
|
public X509Certificate[] getAcceptedIssuers() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
public static String https(String requestUrl, String requestMethod, String outputStr) { |
||||||
|
String result = null; |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
try { |
||||||
|
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
|
||||||
|
TrustManager[] tm = {new MyX509TrustManager()}; |
||||||
|
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); |
||||||
|
sslContext.init(null, tm, new java.security.SecureRandom()); |
||||||
|
// 从上述SSLContext对象中得到SSLSocketFactory对象
|
||||||
|
SSLSocketFactory ssf = sslContext.getSocketFactory(); |
||||||
|
|
||||||
|
URL url = new URL(requestUrl); |
||||||
|
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); |
||||||
|
httpUrlConn.setSSLSocketFactory(ssf); |
||||||
|
|
||||||
|
httpUrlConn.setDoOutput(true); |
||||||
|
httpUrlConn.setDoInput(true); |
||||||
|
httpUrlConn.setUseCaches(false); |
||||||
|
// 设置请求方式(GET/POST)
|
||||||
|
httpUrlConn.setRequestMethod(requestMethod); |
||||||
|
httpUrlConn.connect(); |
||||||
|
// 当有数据需要提交时
|
||||||
|
if (null != outputStr) { |
||||||
|
OutputStream outputStream = httpUrlConn.getOutputStream(); |
||||||
|
// 注意编码格式,防止中文乱码
|
||||||
|
outputStream.write(outputStr.getBytes("UTF-8")); |
||||||
|
outputStream.close(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// 将返回的输入流转换成字符串
|
||||||
|
InputStream inputStream = httpUrlConn.getInputStream(); |
||||||
|
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); |
||||||
|
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); |
||||||
|
|
||||||
|
String str = null; |
||||||
|
while ((str = bufferedReader.readLine()) != null) { |
||||||
|
buffer.append(str); |
||||||
|
} |
||||||
|
bufferedReader.close(); |
||||||
|
inputStreamReader.close(); |
||||||
|
// 释放资源
|
||||||
|
inputStream.close(); |
||||||
|
// inputStream = null;
|
||||||
|
httpUrlConn.disconnect(); |
||||||
|
result = buffer.toString(); |
||||||
|
// jsonObject = JSONObject.fromObject(buffer.toString());
|
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getSuccessJSONObject() { |
||||||
|
return getError("success", 200); |
||||||
|
} |
||||||
|
public static JSONObject getErrorByCreateRelation() { |
||||||
|
return getError("创建职位和部分关联信息失败", 102); |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getError(String msg, int code) { |
||||||
|
JSONObject jsonObject = new JSONObject(); |
||||||
|
jsonObject.put("code", code); |
||||||
|
jsonObject.put("result", msg); |
||||||
|
jsonObject.put("msg", ""); |
||||||
|
return jsonObject; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,204 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
|
||||||
|
import com.fanruan.api.net.http.HttpKit; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.FilterConfig; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.StringWriter; |
||||||
|
import java.net.URLEncoder; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
public class LogoOutFilter extends AbstractGlobalRequestFilterProvider { |
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "outfilter"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{ |
||||||
|
"/decision/logout" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init(FilterConfig filterConfig) { |
||||||
|
ZtgtConfig.getInstance(); |
||||||
|
super.init(filterConfig); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isLogOut(HttpServletRequest req) { |
||||||
|
String url = WebUtils.getOriginalURL(req); |
||||||
|
String servletNamePrefix = "/decision/logout"; |
||||||
|
return url.contains(servletNamePrefix) && req.getMethod().equals("POST"); |
||||||
|
} |
||||||
|
|
||||||
|
private void delLoginOut(HttpServletRequest req, HttpServletResponse res) { |
||||||
|
try { |
||||||
|
//执行帆软内部的退出
|
||||||
|
LoginService.getInstance().logout(req, res); |
||||||
|
JSONObject jsonObject = new JSONObject(); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String url = plConfig.getLogoutUrl(); |
||||||
|
jsonObject.put("data", url); |
||||||
|
//调用外部接口注销accessToken
|
||||||
|
FineLoggerFactory.getLogger().error("登出成功:{} ", url); |
||||||
|
//指定退出之后到他们登录页面
|
||||||
|
WebUtils.printAsJSON(res, jsonObject); |
||||||
|
} catch (Exception var4) { |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
FineLoggerFactory.getLogger().info("当前访问的是:{}",WebUtils.getOriginalURL(request)); |
||||||
|
if (isLogOut(request)) { |
||||||
|
FineLoggerFactory.getLogger().error("退出登录当杜处理"); |
||||||
|
delLoginOut(request, httpServletResponse); |
||||||
|
return; |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getCodeUrl(HttpServletRequest req) throws Exception { |
||||||
|
String originalURL = URLEncoder.encode(WebUtils.getOriginalURL(req), StandardCharsets.UTF_8.name()); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8"); |
||||||
|
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL; |
||||||
|
} |
||||||
|
|
||||||
|
private String getUsername(String code) { |
||||||
|
Token token = getAccessToken(code); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String url = baseUrl + "/profile?access_token=" + token.getContent() + "&client_id=" + clientId + "&client_secret=" + clientSecret + "&oauth_timestamp=" + System.currentTimeMillis(); |
||||||
|
try { |
||||||
|
String s = HttpKit.get(url); |
||||||
|
JSONObject jsonObject = new JSONObject(s); |
||||||
|
return jsonObject.getString("id"); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return StringUtils.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized Token getAccessToken(String code) { |
||||||
|
try { |
||||||
|
token = getNewToken(code); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
private static Token token = null; |
||||||
|
|
||||||
|
private class Token { |
||||||
|
private String content = StringUtils.EMPTY; |
||||||
|
private long expires_in = 0L; |
||||||
|
private long timestamp = 0L; |
||||||
|
|
||||||
|
public Token(String content, long expires_in) { |
||||||
|
Token.this.content = content; |
||||||
|
Token.this.expires_in = expires_in; |
||||||
|
Token.this.timestamp = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getContent() { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public long getExpiresIn() { |
||||||
|
return expires_in; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isTimeout() { |
||||||
|
//考虑到网络传输,有效期我们只算90%
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 900; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean needRefresh() { |
||||||
|
//在70%到90%有效期期间进行刷新
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 700; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Token getNewToken(String code) throws Exception { |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8"); |
||||||
|
String url = baseUrl + "/accessToken?client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=authorization_code&code=" + code + "&redirect_uri=" + redirect_uri; |
||||||
|
String res = HttpKit.post(url, new HashMap<>()); |
||||||
|
if (StringUtils.isEmpty(res)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return parseToken(res); |
||||||
|
} |
||||||
|
|
||||||
|
private Token parseToken(String res) throws Exception { |
||||||
|
JSONObject entries = new JSONObject(res); |
||||||
|
String access_token = entries.getString("access_token"); |
||||||
|
return new Token(access_token, -1); |
||||||
|
} |
||||||
|
|
||||||
|
public static void printException2FrLog(Throwable e) { |
||||||
|
StringWriter writer = new StringWriter(); |
||||||
|
e.printStackTrace(new PrintWriter(writer)); |
||||||
|
String s = writer.toString(); |
||||||
|
FineLoggerFactory.getLogger().error("错误:{}", s); |
||||||
|
} |
||||||
|
|
||||||
|
private void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void login(HttpServletRequest req, HttpServletResponse res, String username) { |
||||||
|
String token = null; |
||||||
|
try { |
||||||
|
token = LoginService.getInstance().login(req, res, username); |
||||||
|
req.setAttribute("fine_auth_token", token); |
||||||
|
FineLoggerFactory.getLogger().error("login success"); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
FineLoggerFactory.getLogger().error("login failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void writerOurError(HttpServletResponse httpServletResponse) { |
||||||
|
try { |
||||||
|
WebUtils.writeOutTemplate("/com/fr/plugin/error.html", httpServletResponse, new HashMap()); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isLogin(HttpServletRequest req) { |
||||||
|
return LoginService.getInstance().isLogged(req); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,191 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
|
||||||
|
import com.fanruan.api.decision.store.StateHubManager; |
||||||
|
import com.fanruan.api.net.http.HttpKit; |
||||||
|
import com.fr.base.TemplateUtils; |
||||||
|
import com.fr.data.NetworkHelper; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.webservice.utils.DecisionStatusService; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.store.StateHubService; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.FilterConfig; |
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import javax.servlet.http.HttpSession; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.StringWriter; |
||||||
|
import java.net.URLEncoder; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.util.Enumeration; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
@FunctionRecorder(localeKey = "zkkd") |
||||||
|
public class PLFilter extends AbstractGlobalRequestFilterProvider { |
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "alfidfdkter"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{ |
||||||
|
"/*" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init(FilterConfig filterConfig) { |
||||||
|
ZtgtConfig.getInstance(); |
||||||
|
FineLoggerFactory.getLogger().error("拦截器启动"); |
||||||
|
super.init(filterConfig); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isLogOut(HttpServletRequest req) { |
||||||
|
String url = WebUtils.getOriginalURL(req); |
||||||
|
String servletNamePrefix = "/decision/logout"; |
||||||
|
return url.contains(servletNamePrefix) && req.getMethod().equals("POST"); |
||||||
|
} |
||||||
|
|
||||||
|
private void delLoginOut(HttpServletRequest req, HttpServletResponse res) { |
||||||
|
try { |
||||||
|
//执行帆软内部的退出
|
||||||
|
User users = UserService.getInstance().getUserByRequestCookie(req); |
||||||
|
|
||||||
|
LoginService.getInstance().logout(req, res); |
||||||
|
if (users != null) { |
||||||
|
FineLoggerFactory.getLogger().error("{} 登出成功 ", users.getUserName()); |
||||||
|
} |
||||||
|
JSONObject jsonObject = new JSONObject(); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String url = plConfig.getLogoutUrl(); |
||||||
|
jsonObject.put("data", url); |
||||||
|
//调用外部接口注销accessToken
|
||||||
|
//指定退出之后到他们登录页面
|
||||||
|
com.fr.web.utils.WebUtils.printAsJSON(res, jsonObject); |
||||||
|
} catch (Exception var4) { |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private boolean needFilter(HttpServletRequest request) { |
||||||
|
String requestURI = request.getRequestURI(); |
||||||
|
String isAdmin = request.getParameter("isAdmin"); |
||||||
|
if (StringUtils.equals(isAdmin, "1")) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (StringUtils.isNotBlank(requestURI) && request.getMethod().equals("GET")) { |
||||||
|
if (requestURI.endsWith("decision")) { |
||||||
|
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 String getOriginalUrlIgnoreCode(HttpServletRequest request) throws Exception { |
||||||
|
StringBuffer url = new StringBuffer(request.getRequestURI()); |
||||||
|
Map parameterMap = request.getParameterMap(); |
||||||
|
Iterator iterator = parameterMap.entrySet().iterator(); |
||||||
|
boolean notFirst = url.toString().indexOf("?") == -1; |
||||||
|
while (iterator.hasNext()) { |
||||||
|
Map.Entry entry = (Map.Entry) iterator.next(); |
||||||
|
if (StringUtils.equals("code", entry.getKey().toString())) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (notFirst) { |
||||||
|
url.append('?'); |
||||||
|
notFirst = false; |
||||||
|
} else { |
||||||
|
url.append('&'); |
||||||
|
} |
||||||
|
|
||||||
|
url.append(entry.getKey().toString()); |
||||||
|
url.append('='); |
||||||
|
url.append( URLEncoder.encode(request.getParameter(entry.getKey().toString()),"utf-8")); |
||||||
|
} |
||||||
|
FineLoggerFactory.getLogger().info("重定向到:" + url.toString()); |
||||||
|
return url.toString(); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
if (isLogOut(request)) { |
||||||
|
delLoginOut(request, httpServletResponse); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (needFilter(request) && !isLogin(request)) { |
||||||
|
//跳转到登录界面
|
||||||
|
setCookie(httpServletResponse, "loginCallBack", getOriginalUrlIgnoreCode(request)); |
||||||
|
sendRedirect(httpServletResponse, getCodeUrl(request)); |
||||||
|
return; |
||||||
|
} |
||||||
|
filterChain.doFilter(request, httpServletResponse); |
||||||
|
} catch (IOException e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} catch (ServletException e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void setCookie(HttpServletResponse response, String name, String value) { |
||||||
|
Cookie cookie = new Cookie(name, value); |
||||||
|
cookie.setPath("/"); |
||||||
|
response.addCookie(cookie); |
||||||
|
} |
||||||
|
private void sendRedirect(HttpServletResponse res, String url) throws IOException { |
||||||
|
Map<String, String> params = new HashMap<>(); |
||||||
|
params.put("callBack", url); |
||||||
|
WebUtils.writeOutTemplate("com/fr/plugin/redirect.html", res, params); |
||||||
|
} |
||||||
|
|
||||||
|
private String getCodeUrl(HttpServletRequest req) throws Exception { |
||||||
|
String originalURL = URLEncoder.encode(getOriginalUrlIgnoreCode(req), StandardCharsets.UTF_8.name()); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl()+"/url/loginCallback", "UTF-8"); |
||||||
|
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
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); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,12 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
|
||||||
|
@FunctionRecorder(localeKey = "pase") |
||||||
|
public class PLFunction { |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public String name() { |
||||||
|
return "功能点检测"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.decision.fun.HttpHandler; |
||||||
|
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||||
|
import com.fr.plugin.handers.*; |
||||||
|
|
||||||
|
public class PLHttpHander extends AbstractHttpHandlerProvider { |
||||||
|
HttpHandler[] actions = new HttpHandler[]{ |
||||||
|
new AddAppAccountHander(), |
||||||
|
new SynPositionHander(), |
||||||
|
new SynDepstHander(), |
||||||
|
new LoginCallBackHandler() |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public HttpHandler[] registerHandlers() { |
||||||
|
return actions; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
|
||||||
|
public class PLLifeCycleMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,193 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
|
||||||
|
import com.fanruan.api.net.http.HttpKit; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
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.IOException; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.StringWriter; |
||||||
|
import java.net.URLEncoder; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
@FunctionRecorder(localeKey = "zyfilter") |
||||||
|
public class PLLoginFilter extends AbstractGlobalRequestFilterProvider { |
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "ffrrww"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{ |
||||||
|
"/decision/login" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init(FilterConfig filterConfig) { |
||||||
|
super.init(filterConfig); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
if (request.getMethod().equals("GET")) { |
||||||
|
String isAdmin = request.getParameter("isAdmin"); |
||||||
|
if (ComparatorUtils.equals(isAdmin, "1")) { |
||||||
|
filterChain.doFilter(request, httpServletResponse); |
||||||
|
return; |
||||||
|
} |
||||||
|
FineLoggerFactory.getLogger().info("来源:{}访问了登陆",request.getHeader("referer")); |
||||||
|
sendRedirect(httpServletResponse, getCodeUrl(request)); |
||||||
|
} else { |
||||||
|
filterChain.doFilter(request, httpServletResponse); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} catch (ServletException e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getCodeUrl(HttpServletRequest req) throws Exception { |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8"); |
||||||
|
String originalURL = URLEncoder.encode(WebUtils.getOriginalURL(req), StandardCharsets.UTF_8.name()); |
||||||
|
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL; |
||||||
|
} |
||||||
|
|
||||||
|
private String getUsername(String code) { |
||||||
|
Token token = getAccessToken(code); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String url = baseUrl + "/profile?access_token=" + token.getContent() + "&client_id=" + clientId + "&client_secret=" + clientSecret + "&oauth_timestamp=" + System.currentTimeMillis(); |
||||||
|
try { |
||||||
|
String s = HttpKit.get(url); |
||||||
|
JSONObject jsonObject = new JSONObject(s); |
||||||
|
return jsonObject.getString("id"); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return StringUtils.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized Token getAccessToken(String code) { |
||||||
|
try { |
||||||
|
token = getNewToken(code); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
private static Token token = null; |
||||||
|
|
||||||
|
private class Token { |
||||||
|
private String content = StringUtils.EMPTY; |
||||||
|
private long expires_in = 0L; |
||||||
|
private long timestamp = 0L; |
||||||
|
|
||||||
|
public Token(String content, long expires_in) { |
||||||
|
Token.this.content = content; |
||||||
|
Token.this.expires_in = expires_in; |
||||||
|
Token.this.timestamp = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getContent() { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public long getExpiresIn() { |
||||||
|
return expires_in; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isTimeout() { |
||||||
|
//考虑到网络传输,有效期我们只算90%
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 900; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean needRefresh() { |
||||||
|
//在70%到90%有效期期间进行刷新
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 700; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Token getNewToken(String code) throws Exception { |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8"); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String url = baseUrl + "/accessToken?client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=authorization_code&code=" + code + "&redirect_uri=" + redirect_uri; |
||||||
|
String res = HttpKit.post(url, new HashMap<>()); |
||||||
|
if (StringUtils.isEmpty(res)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return parseToken(res); |
||||||
|
} |
||||||
|
|
||||||
|
private Token parseToken(String res) throws Exception { |
||||||
|
JSONObject entries = new JSONObject(res); |
||||||
|
String access_token = entries.getString("access_token"); |
||||||
|
return new Token(access_token, -1); |
||||||
|
} |
||||||
|
|
||||||
|
public static void printException2FrLog(Throwable e) { |
||||||
|
StringWriter writer = new StringWriter(); |
||||||
|
e.printStackTrace(new PrintWriter(writer)); |
||||||
|
String s = writer.toString(); |
||||||
|
FineLoggerFactory.getLogger().error("错误:{}", s); |
||||||
|
} |
||||||
|
|
||||||
|
private void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void login(HttpServletRequest req, HttpServletResponse res, String username) { |
||||||
|
String token = null; |
||||||
|
try { |
||||||
|
token = LoginService.getInstance().login(req, res, username); |
||||||
|
req.setAttribute("fine_auth_token", token); |
||||||
|
FineLoggerFactory.getLogger().error("login success"); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
FineLoggerFactory.getLogger().error("login failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void writerOurError(HttpServletResponse httpServletResponse) { |
||||||
|
try { |
||||||
|
WebUtils.writeOutTemplate("/com/fr/plugin/error.html", httpServletResponse, new HashMap()); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isLogin(HttpServletRequest req) { |
||||||
|
return LoginService.getInstance().isLogged(req); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,17 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAlias; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||||
|
|
||||||
|
public class PLUrlAliasProvider extends AbstractURLAliasProvider { |
||||||
|
@Override |
||||||
|
public URLAlias[] registerAlias() { |
||||||
|
return new URLAlias[]{ |
||||||
|
URLAliasFactory.createPluginAlias("/sync/accounts", "/accounts", true), |
||||||
|
URLAliasFactory.createPluginAlias("/sync/positions", "/positions", true), |
||||||
|
URLAliasFactory.createPluginAlias("/sync/deps", "/deps", true), |
||||||
|
URLAliasFactory.createPluginAlias("/loginCallback", "/loginCallback", true), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.third.springframework.util.DigestUtils; |
||||||
|
import com.fr.third.springframework.util.StringUtils; |
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
|
||||||
|
public class SafeCheckUtils { |
||||||
|
public static boolean checkSafe(String body, String appId, String time, String key) { |
||||||
|
ZtgtConfig ztgtConfig = ZtgtConfig.getInstance(); |
||||||
|
String tmp = body + time + appId + ztgtConfig.getSynKey(); |
||||||
|
String md5 = DigestUtils.md5DigestAsHex(tmp.getBytes(StandardCharsets.UTF_8)); |
||||||
|
if (StringUtils.endsWithIgnoreCase(md5, key)) { |
||||||
|
long d = Long.parseLong(time); |
||||||
|
long left = System.currentTimeMillis() + 30000; |
||||||
|
long right = System.currentTimeMillis() - 30000; |
||||||
|
if (d <= left && d >= right) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,93 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
|
||||||
|
@Visualization(category = "用户同步和单点配置") |
||||||
|
public class ZtgtConfig extends DefaultConfiguration { |
||||||
|
|
||||||
|
private static volatile ZtgtConfig config = null; |
||||||
|
|
||||||
|
public static ZtgtConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(ZtgtConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
|
||||||
|
@Identifier(value = "valAddr", name = "接口地址", description = "接口地址", status = Status.SHOW) |
||||||
|
private Conf<String> valAddr = Holders.simple("http://xxx.cn/profile/oauth2"); |
||||||
|
@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.SHOW) |
||||||
|
private Conf<String> appId = Holders.simple(""); |
||||||
|
@Identifier(value = "clientSecret", name = "clientSecret", description = "clientSecret", status = Status.SHOW) |
||||||
|
private Conf<String> clientSecret = Holders.simple(""); |
||||||
|
@Identifier(value = "logoutUrl", name = "统一认证登出地址", description = "统一认证登出地址", status = Status.SHOW) |
||||||
|
private Conf<String> logoutUrl = Holders.simple("http://xxx/logout"); |
||||||
|
@Identifier(value = "synKey", name = "用户同步秘钥", description = "", status = Status.HIDE) |
||||||
|
private Conf<String> synKey = Holders.simple(""); |
||||||
|
|
||||||
|
public String getFrUrl() { |
||||||
|
return frUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSynKey() { |
||||||
|
return synKey.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSynKey(String synKey) { |
||||||
|
this.synKey.set(synKey); |
||||||
|
} |
||||||
|
|
||||||
|
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 String getLogoutUrl() { |
||||||
|
return logoutUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setLogoutUrl(String logoutUrl) { |
||||||
|
this.logoutUrl.set(logoutUrl); |
||||||
|
; |
||||||
|
} |
||||||
|
|
||||||
|
public void setValAddr(String valAddr) { |
||||||
|
this.valAddr.set(valAddr); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object clone() throws CloneNotSupportedException { |
||||||
|
ZtgtConfig cloned = (ZtgtConfig) super.clone(); |
||||||
|
cloned.valAddr = (Conf<String>) valAddr.clone(); |
||||||
|
cloned.appId = (Conf<String>) appId.clone(); |
||||||
|
cloned.synKey = (Conf<String>) synKey.clone(); |
||||||
|
cloned.clientSecret = (Conf<String>) clientSecret.clone(); |
||||||
|
cloned.frUrl = (Conf<String>) frUrl.clone(); |
||||||
|
cloned.logoutUrl = (Conf<String>) logoutUrl.clone(); |
||||||
|
return cloned; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,198 @@ |
|||||||
|
package com.fr.plugin.handers; |
||||||
|
|
||||||
|
import com.fr.collections.FineCollections; |
||||||
|
import com.fr.collections.api.FineLock; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||||
|
import com.fr.decision.authority.controller.DepartmentController; |
||||||
|
import com.fr.decision.authority.controller.PostController; |
||||||
|
import com.fr.decision.authority.controller.UserController; |
||||||
|
import com.fr.decision.authority.data.Department; |
||||||
|
import com.fr.decision.authority.data.Post; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.decision.privilege.encrpt.PasswordValidator; |
||||||
|
import com.fr.decision.webservice.utils.UserSourceFactory; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.Aesutils; |
||||||
|
import com.fr.plugin.HttpUtils; |
||||||
|
import com.fr.plugin.SafeCheckUtils; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.query.QueryFactory; |
||||||
|
import com.fr.stable.query.restriction.RestrictionFactory; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.StringWriter; |
||||||
|
import java.util.List; |
||||||
|
import java.util.UUID; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class AddAppAccountHander extends BaseHttpHandler { |
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/accounts"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { |
||||||
|
String body = HttpUtils.inputStream2String(req.getInputStream()); |
||||||
|
if (StringUtils.isNotBlank(body)) { |
||||||
|
String xtime = req.getHeader("xtime"); |
||||||
|
String xsign = req.getHeader("xkey"); |
||||||
|
|
||||||
|
FineLoggerFactory.getLogger().info("addAppAccount: 请求参数 {}", body); |
||||||
|
JSONObject jsonObject = new JSONObject(body); |
||||||
|
if (jsonObject.has("account")) { |
||||||
|
UserService userService = UserService.getInstance(); |
||||||
|
String account = jsonObject.getString("account"); |
||||||
|
FineLock lock = FineCollections.getInstance().getClient().getLock("syncuser", "lockedname" + account); |
||||||
|
if (lock.tryLock(500L, TimeUnit.MILLISECONDS)) { |
||||||
|
try { |
||||||
|
User user = userService.getUserByUserName(account); |
||||||
|
boolean iscreate = false; |
||||||
|
if (user == null) { |
||||||
|
iscreate = true; |
||||||
|
user = new User(); |
||||||
|
} |
||||||
|
String password = jsonObject.getString("password"); |
||||||
|
JSONObject person_info = jsonObject.getJSONObject("person_info"); |
||||||
|
// JSONObject person_info = new JSONObject(pp_info);
|
||||||
|
String name = person_info.getString("name"); |
||||||
|
String email = person_info.getString("email"); |
||||||
|
String mobile = person_info.getString("mobile"); |
||||||
|
String status = person_info.getString("status");//0启用 1禁用
|
||||||
|
if(iscreate){ |
||||||
|
user.setId(account); |
||||||
|
} |
||||||
|
String userUid = user.getId(); |
||||||
|
user.setRealName(name); |
||||||
|
user.setUserName(account); |
||||||
|
user.setEmail(email); |
||||||
|
user.setEnable(true); |
||||||
|
user.setCreationType(ManualOperationType.KEY); |
||||||
|
user.setMobile(mobile); |
||||||
|
PasswordValidator passwordValidator = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
||||||
|
String pwd; |
||||||
|
if (StringUtils.isBlank(password)) { |
||||||
|
pwd = "frapp.X"; |
||||||
|
} else { |
||||||
|
pwd = Aesutils.getInstance().decrypt(password); |
||||||
|
} |
||||||
|
UserController userController = AuthorityContext.getInstance().getUserController(); |
||||||
|
if (iscreate) { |
||||||
|
try { |
||||||
|
user.setPassword(passwordValidator.encode(account, pwd)); |
||||||
|
userController.add(user); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
} else { |
||||||
|
userController.update(user); |
||||||
|
} |
||||||
|
DepartmentController departmentController = AuthorityContext.getInstance().getDepartmentController(); |
||||||
|
JSONArray groups = person_info.getJSONArray("groups"); |
||||||
|
//先将用户移除原来部门
|
||||||
|
PostController postController = AuthorityContext.getInstance().getPostController(); |
||||||
|
List<Post> posts = postController.findByUser(userUid, QueryFactory.create()); |
||||||
|
//把用户从原来岗位移除
|
||||||
|
for (Post post : posts) { |
||||||
|
//先查到职位,再查职位关联的部门
|
||||||
|
List<Department> departments = departmentController.findByPost(post.getId(), QueryFactory.create()); |
||||||
|
for (Department de : departments) { |
||||||
|
userController.removeUserFromDepartmentAndPost(userUid, de.getId(), post.getId()); |
||||||
|
} |
||||||
|
} |
||||||
|
for (int i = 0; i < groups.length(); i++) { |
||||||
|
JSONObject postions = groups.getJSONObject(i); |
||||||
|
String orgName = postions.getString("orgName"); |
||||||
|
String orgId = postions.getString("orgId"); |
||||||
|
String orgPid = postions.getString("orgPid"); |
||||||
|
Department department = departmentController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", orgId))); |
||||||
|
if (department == null) { |
||||||
|
department = new Department(); |
||||||
|
department.setName(orgName); |
||||||
|
if (StringUtils.equals(orgPid, "0")) { |
||||||
|
orgPid = null; |
||||||
|
} |
||||||
|
department.setId(orgId); |
||||||
|
department.setParentId(orgPid); |
||||||
|
department.setEnable(true); |
||||||
|
departmentController.add(department); |
||||||
|
} |
||||||
|
String positionId = postions.getString("positionId"); |
||||||
|
String positionName = postions.getString("positionName"); |
||||||
|
Post post = postController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", positionId))); |
||||||
|
if (post == null) { |
||||||
|
post = new Post(); |
||||||
|
post.setName(positionName); |
||||||
|
post.setId(positionId); |
||||||
|
post.setEnable(true); |
||||||
|
postController.add(post); |
||||||
|
try { |
||||||
|
postController.addPostToDepartment(positionId, orgId); |
||||||
|
} catch (Exception e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} |
||||||
|
} |
||||||
|
//检查职务和部门是否存在关联关系
|
||||||
|
List<Department> departments = departmentController.findByPost(post.getId(), QueryFactory.create()); |
||||||
|
boolean postindeps = false; |
||||||
|
for (Department department1 : departments) { |
||||||
|
if (StringUtils.equals(department1.getId(), orgId)) { |
||||||
|
postindeps = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
if (!postindeps) { |
||||||
|
try { |
||||||
|
postController.addPostToDepartment(positionId, orgId); |
||||||
|
} catch (Exception e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} |
||||||
|
} |
||||||
|
try { |
||||||
|
userController.addUserToDepartmentAndPost(userUid, orgId, positionId); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error("将用户添加到职位失败:", e); |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getErrorByCreateRelation()); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
printException2FrLog(e); |
||||||
|
} finally { |
||||||
|
lock.unlock(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getSuccessJSONObject()); |
||||||
|
} |
||||||
|
|
||||||
|
public static void printException2FrLog(Throwable e) { |
||||||
|
StringWriter writer = new StringWriter(); |
||||||
|
e.printStackTrace(new PrintWriter(writer)); |
||||||
|
String s = writer.toString(); |
||||||
|
FineLoggerFactory.getLogger().error("错误:{}", s); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,230 @@ |
|||||||
|
package com.fr.plugin.handers; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.net.http.HttpKit; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.decision.webservice.utils.DecisionStatusService; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.PLFilter; |
||||||
|
import com.fr.plugin.ZtgtConfig; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.store.StateHubService; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.net.URLEncoder; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.util.Enumeration; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class LoginCallBackHandler extends BaseHttpHandler { |
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/loginCallback"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { |
||||||
|
String rfToken = req.getParameter("code"); |
||||||
|
if (StringUtils.isNotBlank(rfToken)) { |
||||||
|
String username = getUsername(rfToken); |
||||||
|
User user = UserService.getInstance().getUserByUserName(username); |
||||||
|
if (user != null) { |
||||||
|
login(req, httpServletResponse, username); |
||||||
|
String loginCallBack1 = getCookieByKey(req, "loginCallBack"); |
||||||
|
if (StringUtils.isNotBlank(loginCallBack1)) { |
||||||
|
deleteCookieByName( req, httpServletResponse,"loginCallBack"); |
||||||
|
sendRedirect(httpServletResponse, loginCallBack1); |
||||||
|
return; |
||||||
|
} |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
sendRedirect(httpServletResponse, plConfig.getFrUrl()); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
WebUtils.printAsString(httpServletResponse, username + "用户不存在"); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
sendRedirect(httpServletResponse, getCodeUrl(req)); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 根据key获取cookie |
||||||
|
* @param req |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getCookieByKey(HttpServletRequest req,String key){ |
||||||
|
Cookie[] cookies = req.getCookies(); |
||||||
|
String cookie = ""; |
||||||
|
|
||||||
|
if(cookies == null || cookies.length <=0){ |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
for(int i = 0; i < cookies.length; i++) { |
||||||
|
Cookie item = cookies[i]; |
||||||
|
if (item.getName().equalsIgnoreCase(key)) { |
||||||
|
cookie = item.getValue(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("cookie:"+cookie); |
||||||
|
|
||||||
|
return cookie; |
||||||
|
} |
||||||
|
private String deleteCookieByName(HttpServletRequest request, HttpServletResponse response,String name ) { |
||||||
|
Cookie[] cookies = request.getCookies(); |
||||||
|
if (null == cookies) { |
||||||
|
FineLoggerFactory.getLogger().debug("没有cookie"); |
||||||
|
} else { |
||||||
|
for (Cookie cookie : cookies) { |
||||||
|
if (cookie.getName().equals(name)) { |
||||||
|
String cookieValue = cookie.getValue(); |
||||||
|
//设置值为null
|
||||||
|
cookie.setValue(null); |
||||||
|
//立即销毁cookie
|
||||||
|
cookie.setMaxAge(0); |
||||||
|
cookie.setPath("/"); |
||||||
|
FineLoggerFactory.getLogger().debug("被删除的cookie名字为:{}", cookie.getName(), cookieValue); |
||||||
|
response.addCookie(cookie); |
||||||
|
return cookieValue; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
private String getCodeUrl(HttpServletRequest req) throws Exception { |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String originalURL = URLEncoder.encode(plConfig.getFrUrl() , StandardCharsets.UTF_8.name()); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl()+"/url/loginCallback", "UTF-8"); |
||||||
|
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL; |
||||||
|
} |
||||||
|
|
||||||
|
private class Token { |
||||||
|
private String content = StringUtils.EMPTY; |
||||||
|
private long expires_in = 0L; |
||||||
|
private long timestamp = 0L; |
||||||
|
|
||||||
|
public Token(String content, long expires_in) { |
||||||
|
Token.this.content = content; |
||||||
|
Token.this.expires_in = expires_in; |
||||||
|
Token.this.timestamp = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getContent() { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public long getExpiresIn() { |
||||||
|
return expires_in; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isTimeout() { |
||||||
|
//考虑到网络传输,有效期我们只算90%
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 900; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean needRefresh() { |
||||||
|
//在70%到90%有效期期间进行刷新
|
||||||
|
return System.currentTimeMillis() - timestamp > expires_in * 700; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return "Token{" + |
||||||
|
"content='" + content + '\'' + |
||||||
|
", expires_in=" + expires_in + |
||||||
|
", timestamp=" + timestamp + |
||||||
|
'}'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void sendRedirect(HttpServletResponse res, String url) throws IOException { |
||||||
|
Map<String, String> params = new HashMap<>(); |
||||||
|
params.put("callBack", url); |
||||||
|
WebUtils.writeOutTemplate("com/fr/plugin/redirect.html", res, params); |
||||||
|
} |
||||||
|
|
||||||
|
private void login(HttpServletRequest req, HttpServletResponse res, String username) { |
||||||
|
String token = null; |
||||||
|
try { |
||||||
|
token = LoginService.getInstance().login(req, res, username); |
||||||
|
req.setAttribute("fine_auth_token", token); |
||||||
|
FineLoggerFactory.getLogger().error("{} login success from ticket", username); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
FineLoggerFactory.getLogger().error("login failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getUsername(String code) { |
||||||
|
Token token = getAccessToken(code); |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String url = baseUrl + "/profile?access_token=" + token.getContent() + "&client_id=" + clientId + "&client_secret=" + clientSecret + "&oauth_timestamp=" + System.currentTimeMillis(); |
||||||
|
try { |
||||||
|
String s = HttpKit.get(url); |
||||||
|
LogKit.info("token {} get user info from {} profile {}",token,url, s); |
||||||
|
JSONObject jsonObject = new JSONObject(s); |
||||||
|
return jsonObject.getString("accountId"); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return StringUtils.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized Token getAccessToken(String code) { |
||||||
|
try { |
||||||
|
token = getNewToken(code); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
private static Token token = null; |
||||||
|
|
||||||
|
|
||||||
|
private Token getNewToken(String code) throws Exception { |
||||||
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
||||||
|
String baseUrl = plConfig.getValAddr(); |
||||||
|
String clientId = plConfig.getAppId(); |
||||||
|
String clientSecret = plConfig.getClientSecret(); |
||||||
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl(), "UTF-8"); |
||||||
|
String url = baseUrl + "/accessToken?client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + code + "&redirect_uri=" + redirect_uri; |
||||||
|
String res = HttpKit.get(url, new HashMap<>()); |
||||||
|
LogKit.info("get token from url: {} resp:{}", url, res); |
||||||
|
if (StringUtils.isEmpty(res)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return parseToken(res); |
||||||
|
} |
||||||
|
|
||||||
|
private Token parseToken(String res) throws Exception { |
||||||
|
JSONObject entries = new JSONObject(res); |
||||||
|
String access_token = entries.getString("access_token"); |
||||||
|
return new Token(access_token, -1); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,116 @@ |
|||||||
|
package com.fr.plugin.handers; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fr.collections.FineCollections; |
||||||
|
import com.fr.collections.api.FineLock; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||||
|
import com.fr.decision.authority.controller.DepartmentController; |
||||||
|
import com.fr.decision.authority.controller.UserController; |
||||||
|
import com.fr.decision.authority.data.Department; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.Aesutils; |
||||||
|
import com.fr.plugin.HttpUtils; |
||||||
|
import com.fr.plugin.SafeCheckUtils; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.query.QueryFactory; |
||||||
|
import com.fr.stable.query.restriction.RestrictionFactory; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class SynDepstHander extends BaseHttpHandler { |
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/deps"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { |
||||||
|
String body = HttpUtils.inputStream2String(req.getInputStream()); |
||||||
|
if (StringUtils.isNotBlank(body)) { |
||||||
|
String xtime = req.getHeader("xtime"); |
||||||
|
String xsign = req.getHeader("xkey"); |
||||||
|
// if (!SafeCheckUtils.checkSafe(body, "", xtime, xsign)) {
|
||||||
|
// FineLoggerFactory.getLogger().error("deps: 验证失败");
|
||||||
|
// JSONObject successJSONObject = HttpUtils.getError("签名验证失败", 101);
|
||||||
|
// WebUtils.printAsJSON(httpServletResponse, successJSONObject);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
FineLoggerFactory.getLogger().info("deps: 请求参数 {}", body); |
||||||
|
DepartmentController departmentController = AuthorityContext.getInstance().getDepartmentController(); |
||||||
|
JSONObject jsonObject = new JSONObject(body); |
||||||
|
if (jsonObject.has("deps_info")) { |
||||||
|
JSONObject entries = jsonObject.getJSONObject("deps_info"); |
||||||
|
String orgId = entries.getString("id"); |
||||||
|
FineLock lock = FineCollections.getInstance().getClient().getLock("syncuser", "lockeddep" + orgId); |
||||||
|
try { |
||||||
|
if (lock.tryLock(1L, 20L, TimeUnit.SECONDS)) { |
||||||
|
String status = entries.getString("status"); |
||||||
|
Department department = departmentController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", orgId))); |
||||||
|
boolean enable = true; |
||||||
|
if (StringUtils.equals(status, "1")) { |
||||||
|
enable = false; |
||||||
|
} |
||||||
|
String pid = entries.getString("pid"); |
||||||
|
if (StringUtils.equals(pid, "0")) { |
||||||
|
pid = null; |
||||||
|
} |
||||||
|
if (department == null) { |
||||||
|
department = new Department(); |
||||||
|
department.setName(entries.getString("name")); |
||||||
|
department.setId(orgId); |
||||||
|
department.setParentId(pid); |
||||||
|
department.setEnable(enable); |
||||||
|
department.setCreationType(ManualOperationType.KEY); |
||||||
|
try { |
||||||
|
departmentController.add(department); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
} else { |
||||||
|
department.setName(entries.getString("name")); |
||||||
|
department.setParentId(pid); |
||||||
|
department.setEnable(enable); |
||||||
|
department.setCreationType(ManualOperationType.KEY); |
||||||
|
departmentController.update(department); |
||||||
|
} |
||||||
|
} else { |
||||||
|
FineLoggerFactory.getLogger().info("获取部门同步锁失败:{}", orgId); |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getError("获取部门同步锁失败", 111)); |
||||||
|
return; |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("同步部门异常:{}", e); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
lock.unlock(); |
||||||
|
}catch (Exception e){ |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getSuccessJSONObject()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,144 @@ |
|||||||
|
package com.fr.plugin.handers; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fr.collections.FineCollections; |
||||||
|
import com.fr.collections.api.FineLock; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||||
|
import com.fr.decision.authority.controller.DepartmentController; |
||||||
|
import com.fr.decision.authority.controller.PostController; |
||||||
|
import com.fr.decision.authority.controller.UserController; |
||||||
|
import com.fr.decision.authority.data.Department; |
||||||
|
import com.fr.decision.authority.data.Post; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.HttpUtils; |
||||||
|
import com.fr.plugin.SafeCheckUtils; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.query.QueryFactory; |
||||||
|
import com.fr.stable.query.data.DataList; |
||||||
|
import com.fr.stable.query.restriction.RestrictionFactory; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.List; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class SynPositionHander extends BaseHttpHandler { |
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/positions"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { |
||||||
|
String body = HttpUtils.inputStream2String(req.getInputStream()); |
||||||
|
if (StringUtils.isNotBlank(body)) { |
||||||
|
String xtime = req.getHeader("xtime"); |
||||||
|
String xsign = req.getHeader("xkey"); |
||||||
|
// if (!SafeCheckUtils.checkSafe(body, "", xtime, xsign)) {
|
||||||
|
// FineLoggerFactory.getLogger().error("SynPositionHander: 验证失败");
|
||||||
|
// JSONObject successJSONObject = HttpUtils.getError("签名验证失败", 101);
|
||||||
|
// WebUtils.printAsJSON(httpServletResponse, successJSONObject);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
FineLoggerFactory.getLogger().info("SynPositionHander: 请求参数 {}", body); |
||||||
|
PostController postController = AuthorityContext.getInstance().getPostController(); |
||||||
|
JSONObject jsonObject = new JSONObject(body); |
||||||
|
if (jsonObject.has("position_info")) { |
||||||
|
JSONObject entries = jsonObject.getJSONObject("position_info"); |
||||||
|
String postionId = entries.getString("id"); |
||||||
|
FineLock lock = FineCollections.getInstance().getClient().getLock("syncuser", "lockedpostion" + postionId); |
||||||
|
try { |
||||||
|
if (lock.tryLock(1L, 20, TimeUnit.SECONDS)) { |
||||||
|
String status = entries.getString("status"); |
||||||
|
Post post = postController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", postionId))); |
||||||
|
boolean enable = true; |
||||||
|
if (StringUtils.equals(status, "1")) { |
||||||
|
enable = false; |
||||||
|
} |
||||||
|
String dep_id = entries.getString("dep_id"); |
||||||
|
if (post == null) { |
||||||
|
post = new Post(); |
||||||
|
post.setName(entries.getString("name")); |
||||||
|
post.setId(postionId); |
||||||
|
post.setEnable(enable); |
||||||
|
post.setCreationType(ManualOperationType.KEY); |
||||||
|
try { |
||||||
|
postController.add(post); |
||||||
|
postController.addPostToDepartment(postionId, dep_id); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error("添加职位到部门失败:", e); |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getErrorByCreateRelation()); |
||||||
|
return; |
||||||
|
} |
||||||
|
} else { |
||||||
|
post.setName(entries.getString("name")); |
||||||
|
post.setId(postionId); |
||||||
|
post.setEnable(enable); |
||||||
|
post.setCreationType(ManualOperationType.KEY); |
||||||
|
postController.update(post); |
||||||
|
DepartmentController departmentController = AuthorityContext.getInstance().getDepartmentController(); |
||||||
|
List<Department> departments = departmentController.findByPost(post.getId(), QueryFactory.create()); |
||||||
|
UserController userController = AuthorityContext.getInstance().getUserController(); |
||||||
|
boolean notneedadd = false; |
||||||
|
for (Department de : departments) { |
||||||
|
if (StringUtils.equals(de.getId(), dep_id)) { |
||||||
|
notneedadd = true; |
||||||
|
} else { |
||||||
|
DataList<User> users = userController.findByDepartmentAndPost(de.getId(), postionId, QueryFactory.create()); |
||||||
|
List<User> list = users.getList(); |
||||||
|
for (User user : list) { |
||||||
|
userController.removeUserFromDepartmentAndPost(user.getId(), de.getId(), postionId); |
||||||
|
} |
||||||
|
postController.removePostFromDepartment(postionId, de.getId()); |
||||||
|
} |
||||||
|
} |
||||||
|
if (!notneedadd) { |
||||||
|
try { |
||||||
|
postController.addPostToDepartment(postionId, dep_id); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error("添加职位到部门失败:", e); |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getErrorByCreateRelation()); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getError("获取职位同步锁失败", 111)); |
||||||
|
return; |
||||||
|
} |
||||||
|
}catch (Exception e){ |
||||||
|
LogKit.error("同步异常:{}",e); |
||||||
|
}finally { |
||||||
|
try { |
||||||
|
lock.unlock(); |
||||||
|
}catch (Exception e){ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getSuccessJSONObject()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue