commit a2e95938c0027017d0837fcdf1ed332a3c4bec55 Author: pioneer Date: Thu Nov 24 10:28:51 2022 +0800 open diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb7e25e --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# open-JSD-10110 + +JSD-10110 单点集成\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/lib/finekit-10.0-20220427.jar b/lib/finekit-10.0-20220427.jar new file mode 100644 index 0000000..6793f18 Binary files /dev/null and b/lib/finekit-10.0-20220427.jar differ diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..a4fd0a8 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,23 @@ + + + com.eco.plugin.xx.newlan + + yes + 1.0.4 + 10.0 + 2021-02-10 + fr.open + com.fr.plugin + + + + 2022-5-21 21:46:43 + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/FunctionRecoder.java b/src/main/java/com/fr/plugin/FunctionRecoder.java new file mode 100644 index 0000000..963ca84 --- /dev/null +++ b/src/main/java/com/fr/plugin/FunctionRecoder.java @@ -0,0 +1,12 @@ +package com.fr.plugin; + +import com.fr.plugin.transform.ExecuteFunctionRecord; +import com.fr.plugin.transform.FunctionRecorder; + +@FunctionRecorder +public class FunctionRecoder { + @ExecuteFunctionRecord + public void exe(){ + System.out.println("插件功能埋点,虽然不会执行,除非上架应用"); + } +} diff --git a/src/main/java/com/fr/plugin/NEWLANConfig.java b/src/main/java/com/fr/plugin/NEWLANConfig.java new file mode 100644 index 0000000..18b2552 --- /dev/null +++ b/src/main/java/com/fr/plugin/NEWLANConfig.java @@ -0,0 +1,60 @@ +package com.fr.plugin; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; + +@Visualization(category = "新xx单点配置") +public class NEWLANConfig extends DefaultConfiguration { + + private static volatile NEWLANConfig config = null; + + public static NEWLANConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(NEWLANConfig.class); + } + return config; + } + @Identifier(value = "apiUrl", name = "xx接口地址", description = "xx接口地址", status = Status.SHOW) + private Conf apiUrl = Holders.simple(""); + @Identifier(value = "clientId", name = "clientId", description = "clientId", status = Status.SHOW) + private Conf clientId = Holders.simple(""); + @Identifier(value = "clientSecret", name = "clientSecret", description = "描述", status = Status.SHOW) + private Conf clientSecret = Holders.simple(""); + @Identifier(value = "authUrl", name = "xx认证域名", description = "xx接口地址", status = Status.SHOW) + private Conf authUrl = Holders.simple(""); + public String getApiUrl() { + return apiUrl.get(); + } + public void setApiUrl(String apiUrl) { + this.apiUrl.set(apiUrl); + } + 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 configName) { + this.clientSecret.set(configName); + } + public String getAuthUrl() { + return authUrl.get(); + } + public void setAuthUrl(String authUrl) { + this.authUrl.set(authUrl); + } + @Override + public Object clone() throws CloneNotSupportedException { + NEWLANConfig cloned = (NEWLANConfig) super.clone(); + cloned.apiUrl = (Conf) this.apiUrl.clone(); + cloned.clientId = (Conf) this.clientId.clone(); + cloned.clientSecret = (Conf) this.clientSecret.clone(); + cloned.authUrl = (Conf) this.authUrl.clone(); + return cloned; + } + +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/NEWLANLifeCycleMonitor.java b/src/main/java/com/fr/plugin/NEWLANLifeCycleMonitor.java new file mode 100644 index 0000000..1ab7daa --- /dev/null +++ b/src/main/java/com/fr/plugin/NEWLANLifeCycleMonitor.java @@ -0,0 +1,18 @@ +package com.fr.plugin; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; +import com.fr.stable.fun.Authorize; + +@Authorize +public class NEWLANLifeCycleMonitor extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + NEWLANConfig.getInstance(); + } + + @Override + public void beforeStop(PluginContext pluginContext) { + + } +} diff --git a/src/main/java/com/fr/plugin/http/NEWLANHttpHandler.java b/src/main/java/com/fr/plugin/http/NEWLANHttpHandler.java new file mode 100644 index 0000000..bb522a8 --- /dev/null +++ b/src/main/java/com/fr/plugin/http/NEWLANHttpHandler.java @@ -0,0 +1,16 @@ +package com.fr.plugin.http; + +import com.fr.decision.fun.HttpHandler; +import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; +import com.fr.plugin.http.handler.*; + +public class NEWLANHttpHandler extends AbstractHttpHandlerProvider { + HttpHandler[] actions = new HttpHandler[]{ + new ALLLan_login1Handler(), + }; + + @Override + public HttpHandler[] registerHandlers() { + return actions; + } +} diff --git a/src/main/java/com/fr/plugin/http/NEWLANUrlAliasProvider.java b/src/main/java/com/fr/plugin/http/NEWLANUrlAliasProvider.java new file mode 100644 index 0000000..5bb0b82 --- /dev/null +++ b/src/main/java/com/fr/plugin/http/NEWLANUrlAliasProvider.java @@ -0,0 +1,14 @@ +package com.fr.plugin.http; + +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 NEWLANUrlAliasProvider extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + URLAliasFactory.createPluginAlias("/lan_login", "/lan_login", true), + }; + } +} diff --git a/src/main/java/com/fr/plugin/http/handler/ALLLan_login1Handler.java b/src/main/java/com/fr/plugin/http/handler/ALLLan_login1Handler.java new file mode 100644 index 0000000..b8ca169 --- /dev/null +++ b/src/main/java/com/fr/plugin/http/handler/ALLLan_login1Handler.java @@ -0,0 +1,133 @@ +package com.fr.plugin.http.handler; + +import com.fanruan.api.log.LogKit; +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.BaseHttpHandler; +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.NEWLANConfig; +import com.fr.stable.StringUtils; +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.IOException; +import java.util.UUID; + +public class ALLLan_login1Handler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/lan_login"; + } + + @Override + public boolean isPublic() { + return true; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + String code = req.getParameter("code"); + NEWLANConfig config = NEWLANConfig.getInstance(); + if (StringUtils.isBlank(code)) { + String state= UUID.randomUUID().toString(); + String originalURL = WebUtils.getOriginalURL(req); + String url =String.format("%s/oauth2/authorize?appid=%s&response_type=code&scope=basic_userinfor&state=%s&redirect_uri=%s",config.getAuthUrl(),config.getClientId(),state,originalURL); + sendRedirect(res, url); + return; + } + String appToken = getAppToken(); + String userToken = getUserToken(appToken, code, WebUtils.getOriginalURL(req)); + String userInfo = getUserInfo(appToken, userToken); + UserService userService = UserService.getInstance(); + User user = userService.getUserByUserName(userInfo); + if (user == null) { + WebUtils.printAsString(res,"user:"+userInfo+" not found" ); + return; + } + login(req, res, userInfo); + String defaultUrl = getDefaultUrl(req); + if(isMobile(req)){ + LogKit.info("login to mobile {}",defaultUrl+"/url/mobile"); + sendRedirect(res, defaultUrl+"/url/mobile"); + return; + } + sendRedirect(res, defaultUrl); + } + + public static String getDefaultUrl(HttpServletRequest req) { + StringBuilder url = new StringBuilder(); + try { + url.append(req.getScheme()); + url.append("://"); + url.append(req.getServerName()); + if (req.getServerPort() != 80) { + url.append(":"); + url.append(req.getServerPort()); + } + url.append(TemplateUtils.render("${fineServletURL}")); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return url.toString(); + } + public static boolean isMobile(HttpServletRequest req) { + String[] mobileArray = {"iPhone", "iPad", "android", "windows phone", "xiaomi"}; + String userAgent = req.getHeader("user-agent"); + if (userAgent != null && userAgent.toUpperCase().contains("MOBILE")) { + for (String mobile : mobileArray) { + if (userAgent.toUpperCase().contains(mobile.toUpperCase())) { + return true; + } + } + } + return NetworkHelper.getDevice(req).isMobile(); + } + + 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); + } catch (Exception e) { + } + } + private String getUserInfo(String appToken,String userToken ) throws IOException { + NEWLANConfig config = NEWLANConfig.getInstance(); + String url=String.format("%s/v1/users/fetch?app_token=%s&user_token=%s",config.getApiUrl(),appToken,userToken); + String resp = HttpKit.get(url); + LogKit.info("url:{} getUserInfo resp:{}",url,resp); + JSONObject entries = new JSONObject(resp); + return entries.getJSONObject("data").getString("externalId"); + } + private String getAppToken( ) throws IOException { + NEWLANConfig config = NEWLANConfig.getInstance(); + String url=String.format("%s/v1/apptoken/create?grant_type=client_credential&appid=%s&secret=%s",config.getApiUrl(),config.getClientId(),config.getClientSecret()); + String resp = HttpKit.get(url); + LogKit.info("url:{} getAppToken resp:{} ",url,resp); + JSONObject entries = new JSONObject(resp); + return entries.getJSONObject("data").getString("app_token"); + } + private String getUserToken(String appToken,String code ,String re) throws IOException { + NEWLANConfig config = NEWLANConfig.getInstance(); + String url=String.format("%s/v1/usertoken/create?app_token=%s&grant_type=authorization_code&code=%s&redirect_uri=%s",config.getApiUrl(),appToken,code,re); + String resp = HttpKit.get(url); + LogKit.info("url:{} getUserToken resp:{}",url,resp); + JSONObject entries = new JSONObject(resp); + return entries.getJSONObject("data").getString("user_token"); + } + private void sendRedirect(HttpServletResponse res, String url) { + res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); + res.setHeader("Location", url); + } +}