diff --git a/JSD-7944-需求确认书V1.docx b/JSD-7944-需求确认书V1.docx
new file mode 100644
index 0000000..edf7b17
Binary files /dev/null and b/JSD-7944-需求确认书V1.docx differ
diff --git a/README.md b/README.md
index 83fd8b6..80d2715 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-7944
-JSD-7944 开源任务材料
\ No newline at end of file
+jsd-7944 开源材料\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/jsd-7944配置使用文档.docx b/jsd-7944配置使用文档.docx
new file mode 100644
index 0000000..6c41557
Binary files /dev/null and b/jsd-7944配置使用文档.docx 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/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..4697192
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,24 @@
+
+
+ com.fr.plugin.j7944.sso.auth
+
+ yes
+ 1.0
+ 10.0
+ 2018-07-31
+ mqh
+
+
+ com.fr.plugin.j7944.sso
+
+ com.fanruan.api
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7944/sso/LifeCycleMonitorImpl.java b/src/main/java/com/fr/plugin/j7944/sso/LifeCycleMonitorImpl.java
new file mode 100644
index 0000000..6e86db0
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7944/sso/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.j7944.sso;
+
+ import com.fr.plugin.context.PluginContext;
+ import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
+ import com.fr.plugin.j7944.sso.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/j7944/sso/LocaleFinder.java b/src/main/java/com/fr/plugin/j7944/sso/LocaleFinder.java
new file mode 100644
index 0000000..a2a8681
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7944/sso/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.j7944.sso;
+
+ 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.j7944.sso.config.SsoConfig.PLUGIN_ID;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @EnableMetrics
+ public class LocaleFinder extends AbstractLocaleFinder {
+
+ @Override
+ @Focus(id = PLUGIN_ID, text = "Plugin-J7944-Sso", source = Original.PLUGIN)
+ public String find() {
+ return "com/fr/plugin/j7944/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/j7944/sso/config/SsoConfig.java b/src/main/java/com/fr/plugin/j7944/sso/config/SsoConfig.java
new file mode 100644
index 0000000..d9bb291
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7944/sso/config/SsoConfig.java
@@ -0,0 +1,48 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OneAccessConfig
+ * Author: Louis
+ * Date: 2021/3/30 9:38
+ */
+ package com.fr.plugin.j7944.sso.config;
+
+ 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-J7944-Sso_Group")
+ public class SsoConfig extends DefaultConfiguration {
+ public static final String PLUGIN_ID = "com.fr.plugin.j7944.sso.auth";
+ public static final String APP_DOMAIN = "https://xxx.xxx.com/login/appLogin";
+
+ private static volatile SsoConfig config = null;
+
+ @Focus(id = PLUGIN_ID, text = "Plugin-J7944-Sso", source = Original.PLUGIN)
+ public static SsoConfig getInstance() {
+ if (config == null) {
+ config = ConfigContext.getConfigInstance(SsoConfig.class);
+ }
+ return config;
+ }
+
+ @Identifier(value = "appDomain", name = "Plugin-J7944-Sso_Config_AppDomain", description = "Plugin-J7944-Sso_Config_AppDomain_Description", status = Status.SHOW)
+ private Conf appDomain = Holders.simple(APP_DOMAIN);
+
+ public String getAppDomain() {
+ return appDomain.get();
+ }
+
+ public void setAppDomain(String appDomain) {
+ this.appDomain.set(appDomain);
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/j7944/sso/request/TokenLogin.java b/src/main/java/com/fr/plugin/j7944/sso/request/TokenLogin.java
new file mode 100644
index 0000000..7f4594d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/j7944/sso/request/TokenLogin.java
@@ -0,0 +1,163 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OAuth2Login
+ * Author: Louis
+ * Date: 2021/3/30 22:09
+ */
+ package com.fr.plugin.j7944.sso.request;
+
+ import com.fanruan.api.decision.login.LoginKit;
+ import com.fanruan.api.json.JSONKit;
+ import com.fanruan.api.log.LogKit;
+ import com.fanruan.api.net.NetworkKit;
+ import com.fanruan.api.net.http.HttpKit;
+ import com.fanruan.api.util.StringKit;
+ import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
+ import com.fr.decision.webservice.utils.DecisionServiceConstants;
+ import com.fr.general.ComparatorUtils;
+ import com.fr.json.JSONException;
+ import com.fr.json.JSONObject;
+ import com.fr.plugin.j7944.sso.config.SsoConfig;
+ import com.fr.third.org.apache.http.entity.StringEntity;
+
+ import javax.servlet.FilterChain;
+ import javax.servlet.FilterConfig;
+ import javax.servlet.http.HttpServletRequest;
+ import javax.servlet.http.HttpServletResponse;
+ import java.io.IOException;
+ import java.util.HashMap;
+ import java.util.Map;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class TokenLogin extends AbstractGlobalRequestFilterProvider {
+ public static final String REMOTE_DESIGN = "/remote/design";
+ public static final String RESOURCES_PATH = "/resources";
+ 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 USERNAME = "fine_username";
+ public static final String TICKET = "fine_uuid";
+ public static final String SYSCOD = "syscod";
+
+ private SsoConfig config;
+
+ /**
+ * 过滤器名称
+ *
+ * @return
+ */
+ @Override
+ public String filterName() {
+ return "J7944Filter";
+ }
+
+ /**
+ * 过滤规则
+ *
+ * @return
+ */
+ @Override
+ public String[] urlPatterns() {
+ return new String[]{"/*"};
+ }
+
+ /**
+ * 过滤器初始化
+ *
+ * @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.info("sso-TokenLogin-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;
+ }
+ String username = NetworkKit.getHTTPRequestParameter(req, USERNAME);
+ String ticket = NetworkKit.getHTTPRequestParameter(req, TICKET);
+ String syscod = NetworkKit.getHTTPRequestParameter(req, SYSCOD);
+ LogKit.info("sso-TokenLogin-operation-uuid:{}, username:{}, syscod:{}", ticket, username, syscod);
+ if (StringKit.isEmpty(ticket) || StringKit.isBlank(username) || StringKit.isBlank(syscod)) {
+ return true;
+ }
+ if (!checkTicket(ticket, username, syscod)){
+ return true;
+ }
+ String tokenFR = LoginKit.login(req, res, username);
+ req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR);
+ return true;
+ }
+
+ /**
+ * 验证ticket
+ *
+ * @param ticket
+ * @return
+ */
+ private boolean checkTicket(String ticket, String username, String syscod) throws IOException {
+ JSONObject userInfoParams = JSONKit.create();
+ userInfoParams.put("username", username);
+ userInfoParams.put("sysid", syscod);
+ userInfoParams.put("uuid", ticket);
+ LogKit.info("sso-TokenLogin-checkTicket-params:{}", userInfoParams);
+ Map headers = new HashMap<>();
+ headers.put("Content-Type", "application/json");
+ StringEntity stringEntity = new StringEntity(userInfoParams.encode(), "UTF-8");
+ String userRes = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom()
+ .url(this.config.getAppDomain()).post(stringEntity).headers(headers).build());
+ LogKit.info("sso-TokenLogin-checkTicket-userRes:{}", userRes);
+ try {
+ int sta = new JSONObject(userRes).getJSONObject("data").getInt("sta");
+ return ComparatorUtils.equals(sta, 1);
+ } catch (JSONException e) {
+ LogKit.error(e.getMessage(), e);
+ return false;
+ }
+ }
+ }
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/j7944/sso/locale/lang.properties b/src/main/resources/com/fr/plugin/j7944/sso/locale/lang.properties
new file mode 100644
index 0000000..90fd101
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/j7944/sso/locale/lang.properties
@@ -0,0 +1,6 @@
+Plugin-J7944-Sso=Sso Plugin
+Plugin-J7944-Sso_Group=Sso Plugin
+Plugin-J7944-Sso_Config_systemId=System Id
+Plugin-J7944-Sso_Config_systemId_Description=System Id
+Plugin-J7944-Sso_Config_AppDomain=appLogin url
+Plugin-J7944-Sso_Config_AppDomain_Description=appLogin url
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/j7944/sso/locale/lang_zh_CN.properties b/src/main/resources/com/fr/plugin/j7944/sso/locale/lang_zh_CN.properties
new file mode 100644
index 0000000..ea2495c
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/j7944/sso/locale/lang_zh_CN.properties
@@ -0,0 +1,6 @@
+Plugin-J7944-Sso=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
+Plugin-J7944-Sso_Group=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
+Plugin-J7944-Sso_Config_systemId=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801
+Plugin-J7944-Sso_Config_systemId_Description=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801
+Plugin-J7944-Sso_Config_AppDomain=\u767B\u9646\u9274\u6743\u63A5\u53E3
+Plugin-J7944-Sso_Config_AppDomain_Description=\u767B\u9646\u9274\u6743\u63A5\u53E3
\ No newline at end of file