diff --git a/JSD-7814 -需求确认书V1.docx b/JSD-7814 -需求确认书V1.docx
new file mode 100644
index 0000000..712af8e
Binary files /dev/null and b/JSD-7814 -需求确认书V1.docx differ
diff --git a/README.md b/README.md
index 4ad61fc..5c43736 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-7814
-JSD-7814 开源任务材料
\ No newline at end of file
+jsd-7814 开源材料\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/jsd-7814配置使用文档.docx b/jsd-7814配置使用文档.docx
new file mode 100644
index 0000000..fea5e06
Binary files /dev/null and b/jsd-7814配置使用文档.docx differ
diff --git a/lib/JWT-SDK-1.1.1_1.8.jar b/lib/JWT-SDK-1.1.1_1.8.jar
new file mode 100644
index 0000000..277b8c8
Binary files /dev/null and b/lib/JWT-SDK-1.1.1_1.8.jar differ
diff --git a/lib/finekit-10.0.jar b/lib/finekit-10.0.jar
new file mode 100644
index 0000000..f4482fc
Binary files /dev/null and b/lib/finekit-10.0.jar differ
diff --git a/lib/jose4j-0.7.3.jar b/lib/jose4j-0.7.3.jar
new file mode 100644
index 0000000..9fdd2d6
Binary files /dev/null and b/lib/jose4j-0.7.3.jar differ
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..f0062bf
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,25 @@
+
+
+ com.fr.plugin.j7814.sso
+
+ yes
+ 1.1
+ 10.0
+ 2018-07-31
+ mqh
+
+
+ com.fr.plugin.j7814
+
+ com.fanruan.api
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7814/LifeCycleMonitorImpl.java b/src/main/java/com/fr/plugin/j7814/LifeCycleMonitorImpl.java
new file mode 100644
index 0000000..92cd6f3
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7814/LifeCycleMonitorImpl.java
@@ -0,0 +1,34 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OneAccessLifeCycleMonitor
+ * Author: Louis
+ * Date: 2021/3/30 15:10
+ */
+ package com.fr.plugin.j7814;
+
+ import com.fr.plugin.context.PluginContext;
+ import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
+ import com.fr.plugin.j7814.config.SsoConfig;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class LifeCycleMonitorImpl extends AbstractPluginLifecycleMonitor {
+ public LifeCycleMonitorImpl() {
+ }
+
+ @Override
+ public void afterRun(PluginContext pluginContext) {
+ SsoConfig.getInstance();
+ }
+
+ @Override
+ public void beforeStop(PluginContext pluginContext) {
+
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7814/LocaleFinder.java b/src/main/java/com/fr/plugin/j7814/LocaleFinder.java
new file mode 100644
index 0000000..18cf6b5
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7814/LocaleFinder.java
@@ -0,0 +1,37 @@
+ /*
+ * Copyright (C), 2018-2020
+ * Project: starter
+ * FileName: LocaleFinder
+ * Author: Louis
+ * Date: 2020/8/31 22:19
+ */
+ package com.fr.plugin.j7814;
+
+ import com.fr.intelli.record.Focus;
+import com.fr.intelli.record.Original;
+import com.fr.record.analyzer.EnableMetrics;
+import com.fr.stable.fun.impl.AbstractLocaleFinder;
+
+import static com.fr.plugin.j7814.config.SsoConfig.PLUGIN_ID;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @EnableMetrics
+ public class LocaleFinder extends AbstractLocaleFinder {
+
+ @Override
+ @Focus(id = PLUGIN_ID, text = "Plugin-J7814-Sso", source = Original.PLUGIN)
+ public String find() {
+ return "com/fr/plugin/j7814/sso/locale/lang";
+ }
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7814/config/SsoConfig.java b/src/main/java/com/fr/plugin/j7814/config/SsoConfig.java
new file mode 100644
index 0000000..bfce992
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7814/config/SsoConfig.java
@@ -0,0 +1,78 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OneAccessConfig
+ * Author: Louis
+ * Date: 2021/3/30 9:38
+ */
+ package com.fr.plugin.j7814.config;
+
+ import com.fanruan.api.util.StringKit;
+ import com.fr.config.*;
+ import com.fr.config.holder.Conf;
+ import com.fr.config.holder.factory.Holders;
+ import com.fr.intelli.record.Focus;
+ import com.fr.intelli.record.Original;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @Visualization(category = "Plugin-J7814-Sso_Group")
+ public class SsoConfig extends DefaultConfiguration {
+ public static final String PLUGIN_ID = "com.fr.plugin.j7814";
+
+ private static volatile SsoConfig config = null;
+
+ @Focus(id = PLUGIN_ID, text = "Plugin-J7814-Sso", source = Original.PLUGIN)
+ public static SsoConfig getInstance() {
+ if (config == null) {
+ config = ConfigContext.getConfigInstance(SsoConfig.class);
+ }
+ return config;
+ }
+
+ @Identifier(value = "clientId", name = "Plugin-J7814-Sso_Config_clientId", description = "Plugin-J7814-Sso_Config_clientId_Description", status = Status.SHOW)
+ private Conf clientId = Holders.simple(StringKit.EMPTY);
+ @Identifier(value = "clientSecret", name = "Plugin-J7814-Sso_Config_clientSecret", description = "Plugin-J7814-Sso_Config_clientSecret_Description", status = Status.SHOW)
+ private Conf clientSecret = Holders.simple(StringKit.EMPTY);
+ @Identifier(value = "ipgUrl", name = "Plugin-J7814-Sso_Config_ipgUrl", description = "Plugin-J7814-Sso_Config_ipgUrl_Description", status = Status.SHOW)
+ private Conf ipgUrl = Holders.simple(StringKit.EMPTY);
+ @Identifier(value = "publicKey", name = "Plugin-J7814-Sso_Config_publicKey", description = "Plugin-J7814-Sso_Config_publicKey_Description", status = Status.SHOW)
+ private Conf publicKey = Holders.simple(StringKit.EMPTY);
+
+ public String getClientId() {
+ return clientId.get();
+ }
+
+ public void setClientId(String clientId) {
+ this.clientId.set(clientId);
+ }
+
+ public String getClientSecret() {
+ return clientSecret.get();
+ }
+
+ public void setClientSecret(String clientSecret) {
+ this.clientSecret.set(clientSecret);
+ }
+
+ public String getIpgUrl() {
+ return ipgUrl.get();
+ }
+
+ public void setIpgUrl(String ipgUrl) {
+ this.ipgUrl.set(ipgUrl);
+ }
+
+ public String getPublicKey() {
+ return publicKey.get();
+ }
+
+ public void setPublicKey(String publicKey) {
+ this.publicKey.set(publicKey);
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7814/request/GlobalRequestFilterBridge.java b/src/main/java/com/fr/plugin/j7814/request/GlobalRequestFilterBridge.java
new file mode 100644
index 0000000..e015cda
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7814/request/GlobalRequestFilterBridge.java
@@ -0,0 +1,151 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: GlobalRequestFilterBridge
+ * Author: Louis
+ * Date: 2021/3/30 22:09
+ */
+ package com.fr.plugin.j7814.request;
+
+ import com.fanruan.api.decision.login.LoginKit;
+ import com.fanruan.api.log.LogKit;
+ import com.fanruan.api.net.NetworkKit;
+ import com.fanruan.api.util.StringKit;
+ import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
+ import com.fr.decision.webservice.utils.DecisionServiceConstants;
+ import com.fr.decision.webservice.v10.login.LoginService;
+ import com.fr.plugin.j7814.config.SsoConfig;
+ import com.idsmanager.dingdang.jwt.DingdangUserRetriever;
+
+ import javax.servlet.FilterChain;
+ import javax.servlet.FilterConfig;
+ import javax.servlet.http.HttpServletRequest;
+ import javax.servlet.http.HttpServletResponse;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class GlobalRequestFilterBridge extends AbstractGlobalRequestFilterProvider {
+ public static final String REMOTE_DESIGN = "/remote/design";
+ public static final String RESOURCES_PATH = "/resources";
+ public static final String VIEW_FORM = "/view/form";
+ public static final String VIEW_REPORT = "/view/report";
+ public static final String FILE_PATH = "/file";
+ public static final String SYSTEM_INFO = "/system/info";
+ public static final String MATERIALS_MIN_JS_MAP = "/materials.min.js.map";
+ public static final String LOGIN_PATH = "/login";
+ public static final String LOGIN_OTHER = "/login/";
+ public static final String LOGOUT_PATH = "/logout";
+ public static final String USER_LANGUAGE = "/v10/user/language";
+
+ public static final String ID_TOKEN = "id_token";
+
+ private SsoConfig config;
+
+ /**
+ * 过滤器名称
+ *
+ * @return
+ */
+ @Override
+ public String filterName() {
+ return "J7814Filter";
+ }
+
+ /**
+ * 过滤规则
+ *
+ * @return
+ */
+ @Override
+ public String[] urlPatterns() {
+ return new String[]{"/decision/*"};
+ }
+
+ /**
+ * 过滤器初始化
+ *
+ * @param filterConfig
+ */
+ @Override
+ public void init(FilterConfig filterConfig) {
+ this.config = SsoConfig.getInstance();
+ super.init(filterConfig);
+ }
+
+ /**
+ * 过滤器处理
+ *
+ * @param request
+ * @param response
+ * @param filterChain
+ */
+ @Override
+ public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
+ try {
+ if (operation(request, response)) {
+ filterChain.doFilter(request, response);
+ }
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 用户验证登陆操作
+ *
+ * @param req
+ * @param res
+ * @throws Exception
+ */
+ private boolean operation(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ String pathInfo = (req.getPathInfo() != null) ? req.getPathInfo() : StringKit.EMPTY;
+ LogKit.error("sso-GlobalRequestFilterBridge-operation-pathInfo:{}", pathInfo);
+ if (pathInfo.startsWith(REMOTE_DESIGN) || pathInfo.startsWith(LOGIN_OTHER)
+ || StringKit.equals(LOGIN_PATH, pathInfo)
+ || pathInfo.startsWith(RESOURCES_PATH) || pathInfo.startsWith(LOGOUT_PATH)
+ || pathInfo.startsWith(SYSTEM_INFO) || pathInfo.startsWith(MATERIALS_MIN_JS_MAP)
+ || pathInfo.startsWith(USER_LANGUAGE) || pathInfo.startsWith(FILE_PATH)) {
+ return true;
+ }
+// if (pathInfo.startsWith(VIEW_REPORT) || pathInfo.startsWith(VIEW_FORM)) {
+// return true;
+// }
+ // 已登录
+ if (LoginService.getInstance().isLogged(req)) {
+ return true;
+ }
+ String token = NetworkKit.getHTTPRequestParameter(req, ID_TOKEN);
+ LogKit.error("sso-GlobalRequestFilterBridge-operation-token:{}", token);
+ if (StringKit.isEmpty(token)) {
+ return true;
+ }
+ String username = getUsername(token);
+ LogKit.error("sso-GlobalRequestFilterBridge-operation-username:{}", username);
+ if (StringKit.isEmpty(username)) {
+ return true;
+ }
+ String tokenFR = LoginKit.login(req, res, username);
+ req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR);
+ return true;
+ }
+
+ /**
+ * 通过凭证获得username
+ *
+ * @param token
+ * @return
+ */
+ private String getUsername(String token) throws Exception {
+ DingdangUserRetriever retriever = new DingdangUserRetriever(token, this.config.getPublicKey());
+ DingdangUserRetriever.User user = retriever.retrieve();
+ if (user == null) {
+ return StringKit.EMPTY;
+ }
+ return user.getUsername();
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7814/request/HttpAuthorizeBridge.java b/src/main/java/com/fr/plugin/j7814/request/HttpAuthorizeBridge.java
new file mode 100644
index 0000000..1f23394
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7814/request/HttpAuthorizeBridge.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (C), 2015-2019
+ * FileName: HttpAuthorizeBridge
+ * Author: Louis
+ * Date: 2019/8/9 9:24
+ * Description: HttpAuthorizeBridge
+ * History:
+ *