From 459f8f4fd670773edfc971c8544ae51bdcde1dbc Mon Sep 17 00:00:00 2001 From: pioneer Date: Thu, 22 Sep 2022 14:00:53 +0800 Subject: [PATCH] open --- README.md | 7 + doc/JSD-9151配置使用文档.docx | Bin 0 -> 101943 bytes plugin.xml | 30 +++ .../java/com/fr/plugin/xxx/gzjc/sso/LRGT.java | 28 +++ .../plugin/xxx/gzjc/sso/PluginConstants.java | 10 + .../xxx/gzjc/sso/conf/ExcelExportConfig.java | 48 ++++ .../filter/CustomLogInOutEventProvider.java | 33 +++ .../plugin/xxx/gzjc/sso/filter/SsoFilter.java | 232 +++++++++++++++++ .../fr/plugin/xxx/gzjc/sso/js/FileDef.java | 65 +++++ .../xxx/gzjc/sso/js/WebResourceProvider.java | 25 ++ .../xxx/gzjc/sso/utils/CommonUtils.java | 146 +++++++++++ .../plugin/xxx/gzjc/sso/utils/HttpUtil.java | 237 ++++++++++++++++++ .../plugin/xxx/gzjc/sso/utils/LogUtils.java | 121 +++++++++ .../com/fr/plugin/xxx/gzjc/sso/main.js | 18 ++ src/main/resources/sso.properties | 12 + 15 files changed, 1012 insertions(+) create mode 100644 README.md create mode 100644 doc/JSD-9151配置使用文档.docx create mode 100755 plugin.xml create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/LRGT.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/PluginConstants.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/conf/ExcelExportConfig.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/CustomLogInOutEventProvider.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/SsoFilter.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/js/FileDef.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/js/WebResourceProvider.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/CommonUtils.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/HttpUtil.java create mode 100644 src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/LogUtils.java create mode 100644 src/main/resources/com/fr/plugin/xxx/gzjc/sso/main.js create mode 100644 src/main/resources/sso.properties diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7be761 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ + +# open-JSD-9151 + +JSD-9151 ouath2.0单点\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/doc/JSD-9151配置使用文档.docx b/doc/JSD-9151配置使用文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..0e6aaab6500a0d31f7b8ece65c26d15baf9ac5f1 GIT binary patch literal 101943 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
@{K(^-*XZzd~`0XXJm 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¸o>z;S}5MQxl-7kNhDjmS%j-v6%6 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
hS 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 PAi;1I7*;-@%9sHF9YcWn literal 0 HcmV?d00001 diff --git a/plugin.xml b/plugin.xml new file mode 100755 index 0000000..4a4df5d --- /dev/null +++ b/plugin.xml @@ -0,0 +1,30 @@ + + + com.fr.plugin.xxx.gzjc.sso + + yes + 1.8 + 10.0 + 2018-07-31 + fr.open + + + [2021-12-16]【1.1】接口调用修改。
+ [2021-12-16]【1.2】禁用用户管理。
+ [2021-12-28]【1.3】非拦截不过滤。
+ [2021-01-19]【1.4】配置读取修改。
+ [2021-01-20]【1.5】配置读取修改。
+ [2021-01-20]【1.6】未授权报错问题。
+ [2022-06-29]【1.7】增加spRoleList。
+ [2022-07-14]【1.8】修改无用户提示页面。
+ ]]>
+ + + + + + + + +
\ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/LRGT.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/LRGT.java new file mode 100644 index 0000000..d29fd13 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/LRGT.java @@ -0,0 +1,28 @@ +package com.fr.plugin.xxx.gzjc.sso; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.xxx.gzjc.sso.conf.ExcelExportConfig; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; + +/** + * 配置信息初始化 + */ + +public class LRGT extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + ExcelExportConfig.getInstance(); + + } + + @Override + public void beforeStop(PluginContext pluginContext) { + } + @Override + public void beforeUninstall(PluginContext pluginContext) { + } + + @Override + public void afterInstall(PluginContext var1) { + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/PluginConstants.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/PluginConstants.java new file mode 100644 index 0000000..f88b15b --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/PluginConstants.java @@ -0,0 +1,10 @@ +package com.fr.plugin.xxx.gzjc.sso; + +/** + * @author xxx + * @since 2021/12/04 + */ +public interface PluginConstants { + + String PLUGIN_ID = "com.fr.plugin.xxx.gzjc.sso"; +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/conf/ExcelExportConfig.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/conf/ExcelExportConfig.java new file mode 100644 index 0000000..ab8a249 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/conf/ExcelExportConfig.java @@ -0,0 +1,48 @@ +package com.fr.plugin.xxx.gzjc.sso.conf; + +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; +import com.fr.record.analyzer.EnableMetrics; + + +/** + * @author xxx + * @since 2021/12/04 + */ +@Visualization(category = "Oauth2单点登陆配置") +@EnableMetrics +public class ExcelExportConfig extends DefaultConfiguration { + + private static volatile ExcelExportConfig config = null; + + @Focus(id = "com.fr.plugin.xxx.gzjc.sso", text = "Oauth2单点登陆配置", source = Original.PLUGIN) + public static ExcelExportConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(ExcelExportConfig.class); + } + return config; + } + + @Identifier(value = "debugSwitch", name = "插件调试开关", description = "日志调试模式", status = Status.SHOW) + private Conf debugSwitch = Holders.simple(true); + + public Boolean getDebugSwitch() { + return this.debugSwitch.get(); + } + + public void setDebugSwitch(Boolean debugSwitch) { + this.debugSwitch.set(debugSwitch); + } + + @Override + public Object clone() throws CloneNotSupportedException { + ExcelExportConfig cloned = (ExcelExportConfig) super.clone(); + cloned.debugSwitch = (Conf) debugSwitch.clone(); + return cloned; + } + + +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/CustomLogInOutEventProvider.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/CustomLogInOutEventProvider.java new file mode 100644 index 0000000..dd1c005 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/CustomLogInOutEventProvider.java @@ -0,0 +1,33 @@ +package com.fr.plugin.xxx.gzjc.sso.filter; + +import com.fr.decision.fun.impl.AbstractLogInOutEventProvider; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.general.PropertiesUtils; +import com.fr.stable.StringUtils; + +import java.util.Properties; + +import static com.fr.plugin.xxx.gzjc.sso.utils.CommonUtils.getProperty; + + +/** + * @Author xxx + * @since 2021/8/24 + **/ +public class CustomLogInOutEventProvider extends AbstractLogInOutEventProvider { + + @Override + public String logoutAction(LogInOutResultInfo result) { + Properties props = PropertiesUtils.getProperties("sso"); + String apiClientId = getProperty(props, "api.client_id", false); + String logoutURL = getProperty(props, "api.logout", true); + String logoutRedirectURL = getProperty(props, "api.logout.redirect-url", StringUtils.EMPTY, true); + if (StringUtils.isBlank(logoutURL)) { + return null; + } + if (StringUtils.isBlank(logoutRedirectURL)) { + return String.format("%s?redirectToLogin=false&entityId=%s", logoutURL, apiClientId); + } + return String.format("%s?redirctToUrl=%s&redirectToLogin=true&entityId=%s", logoutURL, logoutRedirectURL, apiClientId); + } +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/SsoFilter.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/SsoFilter.java new file mode 100644 index 0000000..9b8fb38 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/filter/SsoFilter.java @@ -0,0 +1,232 @@ +package com.fr.plugin.xxx.gzjc.sso.filter; + +import com.fr.base.TemplateUtils; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; +import com.fr.decision.webservice.utils.DecisionStatusService; +import com.fr.decision.webservice.utils.WebServiceUtils; +import com.fr.general.PropertiesUtils; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.xxx.gzjc.sso.PluginConstants; +import com.fr.plugin.xxx.gzjc.sso.utils.HttpUtil; +import com.fr.plugin.xxx.gzjc.sso.utils.LogUtils; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.Authorize; +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.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.UUID; + +import static com.fr.plugin.xxx.gzjc.sso.utils.CommonUtils.*; + + +/** + * @author xxx + * @since 2021/12/04 + */ +@FunctionRecorder +@Authorize(callSignKey = PluginConstants.PLUGIN_ID) +public class SsoFilter extends AbstractGlobalRequestFilterProvider { + + + private String apiClientId; + + private String apiClientSecret; + + private String apiAuthorize; + + private String apiGetToken; + + private String apiGetUser; + + private String errorUrl; + + private String appName; + + private void initParams() { + Properties props = PropertiesUtils.getProperties("sso"); + this.apiClientId = props.getProperty("api.client_id"); + this.apiClientSecret = props.getProperty("api.client_secret"); + this.apiAuthorize = props.getProperty("api.authorize"); + this.apiGetToken = props.getProperty("api.get-token"); + this.apiGetUser = props.getProperty("api.get-user"); + this.appName = props.getProperty("api.app-name"); + this.errorUrl = props.getProperty("api.error-url"); + } + + @Override + public void init(FilterConfig filterConfig) { + super.init(filterConfig); + } + + @Override + public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + if (isAccept(request) || isLogin(request)) { + next(request, response, chain); + return; + } + try { + initParams(); + //登录页面跳转地址拦截 + String origin = WebUtils.getHTTPRequestParameter(request, "origin"); + if (request.getRequestURI().endsWith("decision/login")) { + try { + if ("get".equalsIgnoreCase(request.getMethod()) && StringUtils.isNotBlank(origin)) { + OriginUrlResponseBean path = DecisionStatusService.originUrlStatusService().get(origin); + if (path != null) { + String currentPath = String.format("%s://%s:%s%s",request.getScheme(),request.getServerName(),request.getServerPort(),path.getOriginUrl()); + jumpAuthorize(request, response, currentPath); + return; + } + } + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + next(request, response, chain); + return; + } + String code = request.getParameter("code"); + if (StringUtils.isBlank(code)) { + jumpAuthorize(request, response, ""); + return; + } + String username = getUsername(getToken(code)); + if(!existUser(username)){ + String address = String.format("%s?systemName=%s&reason=%s", errorUrl, URLEncoder.encode(appName,"UTF-8"), URLEncoder.encode("用户不存在","UTF-8")); + response.sendRedirect(address); + return; + } + login(username, request, response); + String state = request.getParameter("state"); + if (StringUtils.isNotBlank(state)) { + String accessURL = getCachedParam(state, "accessURL"); + if (StringUtils.isNotBlank(accessURL)) { + response.sendRedirect(accessURL); + return; + } + } + next(request, response, chain); + } catch (Exception e) { + LogUtils.error("oauth2单点登陆处理失败, Cause by: ", e); + setError(response, e.getMessage()); + } + } + + private String getUsername(String token) throws IOException { + String address = String.format("%s?access_token=%s&client_id=%s", apiGetUser, token, apiClientId); + HashMap params = new HashMap<>(); + params.put("access_token", token); + String res = HttpUtil.sendGet(address, null, null); + LogUtils.debug4plugin("请求用户信息返回的内容 >>> [{}]", res); + JSONObject body = new JSONObject(res); + if(body.has("spRoleList")){ + JSONArray array = body.getJSONArray("spRoleList"); + if(array.length() != 0){ + return array.getString(0); + } + } + if (body.has("loginName")) { + return body.getString("loginName"); + } + throw new RuntimeException("获取用户信息失败,Cause by: " + res); + } + + private String getToken(String code) throws IOException { + String address = String.format("%s?client_id=%s&grant_type=authorization_code&code=%s&client_secret=%s", apiGetToken, apiClientId, code, apiClientSecret); + HashMap params = new HashMap<>(); + params.put("client_id", apiClientId); + params.put("client_secret", apiClientSecret); + params.put("code", code); + params.put("grant_type", "authorization_code"); + String res = HttpUtil.sendPost(address, null, JSONObject.create()); + LogUtils.debug4plugin("请求 Token 接口返回的内容 >>> [{}]", res); + JSONObject body = new JSONObject(res); + if (body.has("access_token")) { + return body.getString("access_token"); + } + throw new RuntimeException("获取access_token失败,Cause by: " + res); + } + + private void jumpAuthorize(HttpServletRequest request, HttpServletResponse response, String originUrl) throws Exception { + String state = UUID.randomUUID().toString(); + String accessURL = request.getRequestURL().toString(); + Map params = new HashMap<>(); + if (StringUtils.isNotBlank(originUrl)) { + accessURL = String.format("%s://%s:%s%s",request.getScheme(),request.getServerName(),request.getServerPort(), TemplateUtils.render("${fineServletURL}"));; + params.put("accessURL", originUrl); + } else { + if (StringUtils.isNotBlank(request.getQueryString())) { + accessURL += "?" + request.getQueryString(); + } + params.put("accessURL", accessURL); + } + cacheParams(state, params); + String address = String.format("%s?redirect_uri=%s&state=%s&client_id=%s&response_type=code", apiAuthorize, URLEncoder.encode(accessURL, "UTF-8"), state, apiClientId); + LogUtils.debug4plugin("请求中不包含code值,跳转到登陆页面 >>> \"{}\"", address); + response.sendRedirect(address); + } + + @Override + public String filterName() { + return "sso"; + } + + @Override + @Focus(id = PluginConstants.PLUGIN_ID, text = "机场oauth2单点登陆", source = Original.PLUGIN) + public String[] urlPatterns() { + if (!PluginContexts.currentContext().isAvailable()) { + return new String[]{"/neverbeused"}; + } + return new String[]{ + "/decision/", + "/decision/login", + "/decision", + "/decision/view/report", + "/decision/view/form", + }; + } + + private boolean isAccept(HttpServletRequest request) { + if (request.getRequestURI().endsWith("/view/form") || request.getRequestURI().endsWith("/view/report")) { + if (StringUtils.isNotBlank(WebUtils.getHTTPRequestParameter(request, "code"))) { + return false; + } + return true; + } + return false; + } + + private void setError(HttpServletResponse res, String reason) { + try { + PrintWriter printWriter = WebUtils.createPrintWriter(res); + Map map = new HashMap<>(); + map.put("result", InterProviderFactory.getProvider().getLocText("Fine-Engine_Error_Page_Result")); + map.put("reason", reason); + map.put("solution", InterProviderFactory.getProvider().getLocText("Fine-Engine_Please_Contact_Platform_Admin")); + String page = WebServiceUtils.parseWebPageResourceSafe("com/fr/web/controller/decision/entrance/resources/unavailable.html", map); + printWriter.write(page); + printWriter.flush(); + printWriter.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/FileDef.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/FileDef.java new file mode 100644 index 0000000..a81ee78 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/FileDef.java @@ -0,0 +1,65 @@ +package com.fr.plugin.xxx.gzjc.sso.js; + +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.transform.ExecuteFunctionRecord; +import com.fr.web.struct.Component; +import com.fr.web.struct.Filter; +import com.fr.web.struct.browser.RequestClient; +import com.fr.web.struct.category.ParserType; +import com.fr.web.struct.category.ScriptPath; +import com.fr.web.struct.category.StylePath; + +/** + * @author xxx + * @date 2019/6/12 + */ +public class FileDef extends Component { + public static final FileDef KEY = new FileDef(); + + private FileDef() { + } + + /** + * 返回需要引入的JS脚本路径 + * + * @param client 请求客户端描述 + * @return JS脚本路径 + */ + @Override + public ScriptPath script(RequestClient client) { + if(PluginContexts.currentContext().isAvailable()){ + return ScriptPath.build("/com/fr/plugin/xxx/gzjc/sso/main.js", ParserType.DYNAMIC); + }else { + return ScriptPath.EMPTY; + } + } + + /** + * 返回需要引入的CSS样式路径 + * + * @param client 请求客户端描述 + * @return CSS样式路径 + */ + @Override + public StylePath style(RequestClient client) { + //如果不需要就直接返回 StylePath.EMPTY; + return StylePath.EMPTY; + } + + /** + * 通过给定的资源过滤器控制是否加载这个资源 + * + * @return 资源过滤器 + */ + @ExecuteFunctionRecord + @Override + public Filter filter() { + return new Filter() { + @Override + public boolean accept() { + //任何情况下我们都在平台组件加载时加载我们的组件 + return true; + } + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/WebResourceProvider.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/WebResourceProvider.java new file mode 100644 index 0000000..88af33e --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/js/WebResourceProvider.java @@ -0,0 +1,25 @@ +package com.fr.plugin.xxx.gzjc.sso.js; + +import com.fr.decision.fun.impl.AbstractWebResourceProvider; +import com.fr.decision.web.MainComponent; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.web.struct.Atom; + +/** + * @Author hujian + * @Date 2021/10/25 + * @Description + **/ +@FunctionRecorder + +public class WebResourceProvider extends AbstractWebResourceProvider { + @Override + public Atom attach() { + return MainComponent.KEY; + } + + @Override + public Atom client() { + return FileDef.KEY; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/CommonUtils.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/CommonUtils.java new file mode 100644 index 0000000..cb0eeaf --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/CommonUtils.java @@ -0,0 +1,146 @@ +package com.fr.plugin.xxx.gzjc.sso.utils; + +import com.fr.data.NetworkHelper; +import com.fr.decision.authority.data.User; +import com.fr.decision.mobile.terminal.TerminalHandler; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.utils.DecisionStatusService; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.TokenResource; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.stable.web.Device; +import com.fr.web.utils.WebUtils; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; +import java.util.Properties; + +/** + * @author xxx + * @since 2021/8/24 + */ +public class CommonUtils { + + public static String getProperty(Properties props, String key, String defaultValue, boolean allowBlank) { + String value = props.getProperty(key); + if (StringUtils.isNotBlank(value)) { + return value; + } else { + if (allowBlank) { + LogUtils.warn("Property[" + key + "] value is blank."); + return defaultValue; + } else { + throw new IllegalArgumentException("Property[" + key + "] cann't be blank."); + } + } + } + + public static String getProperty(Properties props, String key, boolean allowBlank) { + return getProperty(props, key, null, allowBlank); + } + + public static String getProperty(Properties props, String key) { + return getProperty(props, key, null, true); + } + + public static boolean isLogin(HttpServletRequest request) { + String oldToken = TokenResource.COOKIE.getToken(request); + return oldToken != null && checkTokenValid(request, (String) oldToken); + } + + private static boolean checkTokenValid(HttpServletRequest req, String token) { + try { + Device device = NetworkHelper.getDevice(req); + LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device)); + return true; + } catch (Exception ignore) { + } + return false; + } + + /** + * 跳转到过滤器链中的下一个过滤器 + * + * @param request + * @param response + * @param chain + */ + public static void next(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + try { + chain.doFilter(request, response); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } + } + + public static boolean existUser(String username){ + try { + User user = UserService.getInstance().getUserByUserName(username); + if (user == null) { + return false; + } + return true; + } catch (Exception e) { + + } + return false; + + } + + public static void login(String username, HttpServletRequest request, HttpServletResponse response) { + try { + User user = UserService.getInstance().getUserByUserName(username); + if (user == null) { + throw new RuntimeException("系统未授权, 当前用户是\"" + username + "\""); + } + String token = LoginService.getInstance().login(request, response, user.getUserName()); + request.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("sso >> Failed to login with[" + username + "]", e); + throw new RuntimeException("用户\"" + username + "\"登录失败"); + } + } + + public static boolean isMobileDevice(HttpServletRequest request) { + if (WebUtils.getDevice(request).isMobile()) { + LogUtils.debug4plugin("current request is is mobile request ,url is {}", request.getRequestURI()); + return true; + } + String requestHeader = request.getHeader("user-agent"); + String[] deviceArray = new String[]{"android", "iphone", "ipad", "ios", "windows phone", "wechat"}; + if (requestHeader == null) { + return false; + } + requestHeader = requestHeader.toLowerCase(); + for (int i = 0; i < deviceArray.length; i++) { + if (requestHeader.toLowerCase().contains(deviceArray[i])) { + LogUtils.debug4plugin("current request:{} is mobile request!", request.getRequestURI()); + return true; + } + } + String op = WebUtils.getHTTPRequestParameter(request, "op"); + return StringUtils.isNotBlank(op) && StringUtils.equals("h5", op); + } + + public static void cacheParams(String key, Map values) { + try { + DecisionStatusService.originUrlStatusService().put(key, values); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String getCachedParam(String key, String name) { + try { + Map values = DecisionStatusService.originUrlStatusService().get(key); + return values.get(name); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/HttpUtil.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/HttpUtil.java new file mode 100644 index 0000000..5a135db --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/HttpUtil.java @@ -0,0 +1,237 @@ +package com.fr.plugin.xxx.gzjc.sso.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSession; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Iterator; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author xxx + * @Date 2020/12/05 + * @Description + **/ +public class HttpUtil { + + private static HostnameVerifier hv = new HostnameVerifier() { + @Override + public boolean verify(String urlHostName, SSLSession session) { + System.out.println("Warning: URL Host: " + urlHostName + " vs. " + + session.getPeerHost()); + return true; + } + }; + + /** + * 发送get请求 + * + * @param url + * @param param + * @param header + * @return + * @throws IOException + */ + public static String sendGet(String url, Map param, Map header) { + String result = ""; + BufferedReader in = null; + String urlNameString = url; + try { + if (param != null) { + urlNameString += "?"; + urlNameString += param.entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(Collectors.joining("&")); + } + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection connection; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + connection = (HttpURLConnection) realUrl.openConnection(); + } else { + connection = (HttpURLConnection) realUrl.openConnection(); + } + //设置超时时间 + connection.setDoInput(true); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(15000); + // 设置通用的请求属性 + if (header != null) { + Iterator> it = header.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + System.out.println(entry.getKey() + ":::" + entry.getValue()); + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 建立实际的连接 + connection.connect(); + // 定义 BufferedReader输入流来读取URL的响应,设置utf8防止中文乱码 + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + if (in != null) { + in.close(); + } + }catch (Exception e){ + FineLoggerFactory.getLogger().error(e,"get url error ,url is:{},error is {}",urlNameString,e.getMessage()); + } + return result; + } + + public static String sendPost(String url,Map header, JSONObject body) { + PrintWriter out = null; + BufferedReader in = null; + String result = StringUtils.EMPTY; + String res = StringUtils.EMPTY; + try { + String urlNameString = url; + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection conn; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + conn = (HttpURLConnection) realUrl.openConnection(); + } else { + conn = (HttpURLConnection) realUrl.openConnection(); + } + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Content-Type","application/json;;charset=UTF-8"); + //conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=----footfoodapplicationrequestnetwork"); + if(header != null){ + header.forEach((k, v) -> { + conn.setRequestProperty(k, v); + }); + } + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + //获取请求头 + + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + StringBuffer buffer = new StringBuffer(); + /*param.forEach((k,v)->{ + buffer.append("------footfoodapplicationrequestnetwork\r\n"); + buffer.append("Content-Disposition: form-data; name=\""); + buffer.append(k); + buffer.append("\"\r\n\r\n"); + buffer.append(v); + buffer.append("\r\n"); + }); + buffer.append("------footfoodapplicationrequestnetwork--\r\n"); + out.print(buffer.toString());*/ + // 发送请求参数 + if(body != null){ + out.print(body.toString()); + } + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + res = result; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } + //使用finally块来关闭输出流、输入流 + finally{ + try{ + if(out!=null){ + out.close(); + } + if(in!=null){ + in.close(); + } + } + catch(IOException e){ + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } + } + return res; + } + + private static void trustAllHttpsCertificates() throws Exception { + javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; + javax.net.ssl.TrustManager tm = new miTM(); + trustAllCerts[0] = tm; + javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL","SunJSSE"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + + /** + * encode url by UTF-8 + * @param url url before encoding + * @return url after encoding + */ + public static String encodeUrl(String url){ + String eurl = url; + try { + eurl = URLEncoder.encode(url,"UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return eurl; + } + + private static class miTM implements javax.net.ssl.TrustManager, + javax.net.ssl.X509TrustManager { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public boolean isServerTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + public boolean isClientTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException { + return; + } + + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException { + return; + } + } +} diff --git a/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/LogUtils.java b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/LogUtils.java new file mode 100644 index 0000000..98cb31c --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/gzjc/sso/utils/LogUtils.java @@ -0,0 +1,121 @@ +package com.fr.plugin.xxx.gzjc.sso.utils; + +import com.fr.log.FineLoggerFactory; +import com.fr.log.FineLoggerProvider; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.xxx.gzjc.sso.conf.ExcelExportConfig; +import com.fr.stable.StringUtils; + +/** + * @author xxx + * @since 2021/12/04 + */ +public final class LogUtils { + private static final String DEBUG_PREFIX = "[插件调试] "; + private static String LOG_PREFIX = "[OAUTH2单点登陆] "; + private static final String PLUGIN_VERSION; + + private static final FineLoggerProvider LOGGER = FineLoggerFactory.getLogger(); + + static { + String version = PluginContexts.currentContext().getMarker().getVersion(); + if (StringUtils.isNotBlank(version)) { + PLUGIN_VERSION = "[v" + version + "] "; + } else { + PLUGIN_VERSION = "[unknown version] "; + } + + LOG_PREFIX = LOG_PREFIX + PLUGIN_VERSION; + } + + public static void setPrefix(String prefix) { + if (prefix != null) { + LOG_PREFIX = prefix; + } + } + + public static boolean isDebugEnabled() { + return LOGGER.isDebugEnabled(); + } + + public static void debug(String s) { + LOGGER.debug(LOG_PREFIX + s); + } + + public static void debug(String s, Object... objects) { + LOGGER.debug(LOG_PREFIX + s, objects); + } + + public static void debug(String s, Throwable throwable) { + LOGGER.debug(LOG_PREFIX + s, throwable); + } + + public static void debug4plugin(String s) { + if (ExcelExportConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s); + } else { + LOGGER.debug(LOG_PREFIX + s); + } + } + + public static void debug4plugin(String s, Object... objects) { + if (ExcelExportConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, objects); + } else { + LOGGER.debug(LOG_PREFIX + s, objects); + } + } + + public static void debug4plugin(String s, Throwable throwable) { + if (ExcelExportConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, throwable); + } else { + LOGGER.debug(LOG_PREFIX + s, throwable); + } + } + + + public static boolean isInfoEnabled() { + return LOGGER.isInfoEnabled(); + } + + public static void info(String s) { + LOGGER.info(LOG_PREFIX + s); + } + + public static void info(String s, Object... objects) { + LOGGER.info(LOG_PREFIX + s, objects); + } + + public static void warn(String s) { + LOGGER.warn(LOG_PREFIX + s); + } + + public static void warn(String s, Object... objects) { + LOGGER.warn(LOG_PREFIX + s, objects); + } + + public static void warn(String s, Throwable throwable) { + LOGGER.warn(LOG_PREFIX + s, throwable); + } + + public static void warn(Throwable throwable, String s, Object... objects) { + LOGGER.warn(throwable, LOG_PREFIX + s, objects); + } + + public static void error(String s) { + LOGGER.error(LOG_PREFIX + s); + } + + public static void error(String s, Object... objects) { + LOGGER.error(LOG_PREFIX + s, objects); + } + + public static void error(String s, Throwable throwable) { + LOGGER.error(LOG_PREFIX + s, throwable); + } + + public static void error(Throwable throwable, String s, Object... objects) { + LOGGER.error(throwable, LOG_PREFIX + s, objects); + } +} diff --git a/src/main/resources/com/fr/plugin/xxx/gzjc/sso/main.js b/src/main/resources/com/fr/plugin/xxx/gzjc/sso/main.js new file mode 100644 index 0000000..fd09373 --- /dev/null +++ b/src/main/resources/com/fr/plugin/xxx/gzjc/sso/main.js @@ -0,0 +1,18 @@ +/* +BI.Plugin.registerObject("dec.user.row.tools", function (widget) { + widget.element.empty(); +}); + +BI.config("dec.users.operations.import",function( widget ){ + //把type: "dec.user.account.setting.item"的去掉 + widget.element.empty(); +}); +BI.config("dec.users.operations.sync",function( widget ){ + //把type: "dec.user.account.setting.item"的去掉 + widget.element.empty(); +}); + +BI.config("dec.users.operations.add",function( widget ){ + //把type: "dec.user.account.setting.item"的去掉 + widget.element.empty(); +});*/ diff --git a/src/main/resources/sso.properties b/src/main/resources/sso.properties new file mode 100644 index 0000000..7880aae --- /dev/null +++ b/src/main/resources/sso.properties @@ -0,0 +1,12 @@ +api.client_id=xxxxxx +api.client_secret=xxxxxx +api.authorize=https://127.0.0.1:8080/idp/oauth2/authorize +api.get-token=https://127.0.0.1:8080/idp/oauth2/getToken +api.get-user=https://127.0.0.1:8080/idp/oauth2/getUserInfo +api.logout=https://127.0.0.1:8080/idp/profile/OAUTH2/Redirect/GLO + +api.logout.redirect-url=https://www.baidu.com + +api.app-name= + +api.error-url= \ No newline at end of file