From 7e7e4b34e12dd1d0bb306181429b36e578263d7c Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Mon, 6 Dec 2021 19:19:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JSD-8933-需求文档V1.docx | Bin 0 -> 63117 bytes README.md | 5 +- plugin.xml | 25 ++++ .../fr/plugin/xxxx/cqjg/jump/Constants.java | 9 ++ .../plugin/xxxx/cqjg/jump/GlobalFilter.java | 109 ++++++++++++++ .../cqjg/jump/TokenRequestHandlerBridge.java | 18 +++ .../cqjg/jump/TokenRequestURLAliasBridge.java | 18 +++ .../xxxx/cqjg/jump/handle/TokenHandler.java | 136 ++++++++++++++++++ 8 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 JSD-8933-需求文档V1.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/xxxx/cqjg/jump/Constants.java create mode 100644 src/main/java/com/fr/plugin/xxxx/cqjg/jump/GlobalFilter.java create mode 100644 src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestHandlerBridge.java create mode 100644 src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestURLAliasBridge.java create mode 100644 src/main/java/com/fr/plugin/xxxx/cqjg/jump/handle/TokenHandler.java diff --git a/JSD-8933-需求文档V1.docx b/JSD-8933-需求文档V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..780db3715af8d3a8b8cc7c109d3bd2c07a0d2afe GIT binary patch literal 63117 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 AUH||9 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index ff5c4d9..ec0e5f9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # open-JSD-8933 -JSD-8933 chrome打开实现 \ No newline at end of file +JSD-8933 chrome打开实现\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..046268b --- /dev/null +++ b/plugin.xml @@ -0,0 +1,25 @@ + + + com.fr.plugin.xxxx.cqjg.jump + com.fr.plugin.xxxx.cqjg.jump + + yes + 1.4 + 10.0 + 2018-07-31 + fr.open + + + [2021-11-04]【1.1】逻辑修改为解析token中用户的方式。
+ [2021-11-08]【1.2】增加获取token链接,直接比对数据库密码。
+ [2021-11-08]【1.3】增加sha256加密后比对数据库密码。
+ [2021-11-08]【1.4】增加写入cookie。
+ ]]>
+ + + + + + +
\ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxxx/cqjg/jump/Constants.java b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/Constants.java new file mode 100644 index 0000000..c5d9a07 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/Constants.java @@ -0,0 +1,9 @@ +package com.fr.plugin.xxxx.cqjg.jump; + +/** + * @author fr.open + * @date 2020/5/14 + */ +public class Constants { + public static final String PLUGIN_ID = "com.fr.plugin.xxxx.cqjg.jump"; +} diff --git a/src/main/java/com/fr/plugin/xxxx/cqjg/jump/GlobalFilter.java b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/GlobalFilter.java new file mode 100644 index 0000000..a099e23 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/GlobalFilter.java @@ -0,0 +1,109 @@ +package com.fr.plugin.xxxx.cqjg.jump; + +import com.fr.cert.token.Claims; +import com.fr.cert.token.Jwts; +import com.fr.decision.authority.data.User; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.webservice.exception.user.UserNotExistException; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.v10.config.ConfigService; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.security.KeySecretSeedConfig; +import com.fr.security.SecurityToolbox; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.Authorize; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Author fr.open + * @Date 2021/10/29 + * @Description + **/ +@FunctionRecorder +@Authorize(callSignKey = Constants.PLUGIN_ID) +@EnableMetrics +public class GlobalFilter extends AbstractGlobalRequestFilterProvider { + + private static final String flag = "00000"; + + @Override + public String filterName() { + return "global"; + } + + @Override + @Focus(id = Constants.PLUGIN_ID, text = "xxxx跳转", source = Original.PLUGIN) + public String[] urlPatterns() { + if (PluginContexts.currentContext().isAvailable()) { + String servletPathName = "decision"; + try { + servletPathName = ConfigService.getInstance().getBasicParam().getServletPathName(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return new String[]{ + "/" + servletPathName, + "/" + servletPathName + "/view/report", + + }; + } else { + return new String[0]; + } + } + + @Override + public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { + String query = req.getQueryString(); + if (StringUtils.isNotBlank(query) && query.contains(flag)) { + int start = query.indexOf(flag) + 5; + int end = query.indexOf("&", start); + String token = query.substring(start, end == -1 ? query.length() : end); + FineLoggerFactory.getLogger().info("get token is {}", token); + try { + byte[] bytes = SecurityToolbox.base642Byte(KeySecretSeedConfig.getInstance().getTrustSeed()); + Claims claims = Jwts.parser().setSigningKey(bytes).parseClaimsJws(token).getBody(); + loginFromToken(req,res,claims.getSubject()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + try { + filterChain.doFilter(req, res); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } catch (ServletException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + + private boolean loginFromToken(HttpServletRequest req, HttpServletResponse res, String username) throws Exception { + try { + if (StringUtils.isNotEmpty(username)) { + User user = UserService.getInstance().getUserByUserName(username); + if (user == null) { + throw new UserNotExistException(); + } + String token = LoginService.getInstance().login(req, res, username); + req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + return true; + } else { + return false; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return false; + } +} diff --git a/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestHandlerBridge.java b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestHandlerBridge.java new file mode 100644 index 0000000..aa60cd4 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestHandlerBridge.java @@ -0,0 +1,18 @@ +package com.fr.plugin.xxxx.cqjg.jump; + +import com.fr.decision.fun.HttpHandler; +import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; +import com.fr.plugin.xxxx.cqjg.jump.handle.TokenHandler; + +/** + * @author fr.open + * @since 2021/07/28 + */ +public class TokenRequestHandlerBridge extends AbstractHttpHandlerProvider { + @Override + public HttpHandler[] registerHandlers() { + return new HttpHandler[]{ + new TokenHandler() + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestURLAliasBridge.java b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestURLAliasBridge.java new file mode 100644 index 0000000..53325a8 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/TokenRequestURLAliasBridge.java @@ -0,0 +1,18 @@ +package com.fr.plugin.xxxx.cqjg.jump; + +import com.fr.decision.fun.impl.AbstractURLAliasProvider; +import com.fr.decision.webservice.url.alias.URLAlias; +import com.fr.decision.webservice.url.alias.URLAliasFactory; + +/** + * @author fr.open + * @since 2021/07/28 + */ +public class TokenRequestURLAliasBridge extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + URLAliasFactory.createPluginAlias("/token", "/token", true), + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxxx/cqjg/jump/handle/TokenHandler.java b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/handle/TokenHandler.java new file mode 100644 index 0000000..f4fd30e --- /dev/null +++ b/src/main/java/com/fr/plugin/xxxx/cqjg/jump/handle/TokenHandler.java @@ -0,0 +1,136 @@ +package com.fr.plugin.xxxx.cqjg.jump.handle; + +import com.fr.base.ServerConfig; +import com.fr.base.TemplateUtils; +import com.fr.data.NetworkHelper; +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.data.User; +import com.fr.decision.config.FSConfig; +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.decision.mobile.terminal.TerminalHandler; +import com.fr.decision.webservice.CrossDomainResponse; +import com.fr.decision.webservice.bean.authentication.LoginClientBean; +import com.fr.decision.webservice.exception.user.UserNotExistException; +import com.fr.decision.webservice.utils.DecisionStatusService; +import com.fr.log.FineLoggerFactory; +import com.fr.security.JwtUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.stable.web.Device; +import com.fr.store.Converter; +import com.fr.third.com.lowagie.text.pdf.BadPasswordException; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +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.util.HashMap; + + +/** + * @author fr.open + * @Date 2021/08/17 + */ +public class TokenHandler extends BaseHttpHandler { + + @Override + public RequestMethod getMethod() { + return RequestMethod.GET; + } + + @Override + public String getPath() { + return "/token"; + } + + @Override + public boolean isPublic() { + return true; + } + + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) { + CrossDomainResponse domainResponse = null; + try { + String origin = NetworkHelper.getOriginalURL(req); + String uri = req.getRequestURI(); + String render = TemplateUtils.render(origin.replace(uri, "${fineServletURL}")); + String username = WebUtils.getHTTPRequestParameter(req, "fine_username"); + String password = WebUtils.getHTTPRequestParameter(req, "fine_password"); + String validity = WebUtils.getHTTPRequestParameter(req, "validity"); + User user = AuthorityContext.getInstance().getUserController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", username))); + if (user == null) { + throw new UserNotExistException(); + } + if (!StringUtils.equals(DigestUtils.sha256Hex(password), user.getPassword())) { + throw new BadPasswordException(); + } + long timeout = getTokenTimeOutByValidity(Integer.parseInt(validity)); + String token = generateToken(user.getUserName(), user.getDisplayName(), user.getTenantId(),timeout ); + Device device = NetworkHelper.getDevice(req); + TerminalHandler handler = TerminalHandler.getTerminal(req, device); + LoginClientBean clientBean = new LoginClientBean(req, device, handler); + clientBean.setUsername(user.getUserName()); + clientBean.setToken(token); + clientBean.setValidity(Integer.parseInt(validity)); + clientBean.setUserId(user.getId()); + this.addLoginStatus(token, clientBean, timeout); + this.writeToken2Cookie(res, token, Integer.parseInt(validity)); + + domainResponse = CrossDomainResponse.create().callbackFuncName("callback").parameter("accessToken",token).parameter("url", render).parameter("status", "success"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + domainResponse = CrossDomainResponse.error(e, "callback"); + } + try { + WebUtils.printAsString(res, domainResponse.createCrossDomainResponse()); + ; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + private void writeToken2Cookie(HttpServletResponse res, String token, int validity) { + try { + if (StringUtils.isNotEmpty(token)) { + Cookie tokenCookie = new Cookie("fine_auth_token", token); + long timeout = validity == -2 ? 1209600000L : (long)validity; + tokenCookie.setMaxAge((int)timeout); + tokenCookie.setPath(ServerConfig.getInstance().getCookiePath()); + res.addCookie(tokenCookie); + Cookie rememberLogin = new Cookie("fine_remember_login", String.valueOf(validity == -2 ? -2 : -1)); + rememberLogin.setMaxAge((int)timeout); + rememberLogin.setPath(ServerConfig.getInstance().getCookiePath()); + res.addCookie(rememberLogin); + } else { + FineLoggerFactory.getLogger().error("empty token cannot save."); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + + private void addLoginStatus(String token, LoginClientBean bean, long timeout) throws Exception { + DecisionStatusService.loginStatusService().put(token, bean, new Converter() { + @Override + public String[] createAlias(LoginClientBean bean) { + return new String[]{bean.getUsername()}; + } + }, timeout); + } + + private long getTokenTimeOutByValidity(int validity) { + return validity == -2 ? 1209600000L : FSConfig.getInstance().getLoginConfig().getLoginTimeout(); + } + + private String generateToken(String username, String displayName, String tenanId, long validity) { + HashMap map = new HashMap(); + map.put("description", displayName); + map.put("tenantId", tenanId); + return JwtUtils.createDefaultJWT(username, map, validity); + } +}