Browse Source

open

master
pioneer 2 years ago
commit
4737118f51
  1. 6
      README.md
  2. BIN
      doc/JSD-9983配置使用文档.docx
  3. BIN
      doc/jsd-9983-需求确认书.docx
  4. BIN
      lib/finekit-10.0.jar
  5. 24
      plugin.xml
  6. 37
      src/main/java/com/fr/plugin/ishc/LocaleFinder.java
  7. 34
      src/main/java/com/fr/plugin/ishc/PluginMonitor.java
  8. 44
      src/main/java/com/fr/plugin/ishc/config/IshcConfig.java
  9. 203
      src/main/java/com/fr/plugin/ishc/request/OAuthLogin.java
  10. 5
      src/main/resources/com/fr/plugin/ishc/locale/lang.properties
  11. 5
      src/main/resources/com/fr/plugin/ishc/locale/lang_zh_CN.properties

6
README.md

@ -0,0 +1,6 @@
# open-JSD-9983
JSD-9983 单点集成\
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
仅作为开发者学习参考使用!禁止用于任何商业用途!\
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。

BIN
doc/JSD-9983配置使用文档.docx

Binary file not shown.

BIN
doc/jsd-9983-需求确认书.docx

Binary file not shown.

BIN
lib/finekit-10.0.jar

Binary file not shown.

24
plugin.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<id>com.fr.plugin.ishc.sso</id>
<name><![CDATA[单点登陆]]></name>
<active>yes</active>
<version>1.1</version>
<env-version>10.0</env-version>
<jartime>2018-07-31</jartime>
<vendor>fr.open</vendor>
<description><![CDATA[单点登陆]]></description>
<change-notes><![CDATA[单点登陆]]></change-notes>
<main-package>com.fr.plugin.ishc</main-package>
<prefer-packages>
<prefer-package>com.fanruan.api</prefer-package>
</prefer-packages>
<lifecycle-monitor class="com.fr.plugin.ishc.PluginMonitor"/>
<extra-core>
<LocaleFinder class="com.fr.plugin.ishc.LocaleFinder"/>
</extra-core>
<extra-decision>
<GlobalRequestFilterProvider class="com.fr.plugin.ishc.request.OAuthLogin"/>
</extra-decision>
<function-recorder class="com.fr.plugin.ishc.LocaleFinder"/>
</plugin>

37
src/main/java/com/fr/plugin/ishc/LocaleFinder.java

@ -0,0 +1,37 @@
/*
* Copyright (C), 2018-2020
* Project: starter
* FileName: LocaleFinder
* Author: xx
* Date: 2020/8/31 22:19
*/
package com.fr.plugin.ishc;
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.ishc.config.IshcConfig.PLUGIN_ID;
/**
* <Function Description><br>
* <LocaleFinder>
*
* @author xx
* @since 1.0.0
*/
@EnableMetrics
public class LocaleFinder extends AbstractLocaleFinder {
@Override
@Focus(id = PLUGIN_ID, text = "Plugin-ishc", source = Original.PLUGIN)
public String find() {
return "com/fr/plugin/ishc/locale/lang";
}
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
}

34
src/main/java/com/fr/plugin/ishc/PluginMonitor.java

@ -0,0 +1,34 @@
/*
* Copyright (C), 2018-2021
* Project: starter
* FileName: PluginMonitor
* Author: xx
* Date: 2021/3/30 15:10
*/
package com.fr.plugin.ishc;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.ishc.config.IshcConfig;
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
/**
* <Function Description><br>
* <PluginMonitor>
*
* @author xx
* @since 1.0.0
*/
public class PluginMonitor extends AbstractPluginLifecycleMonitor {
public PluginMonitor() {
}
@Override
public void afterRun(PluginContext pluginContext) {
IshcConfig.getInstance();
}
@Override
public void beforeStop(PluginContext pluginContext) {
}
}

44
src/main/java/com/fr/plugin/ishc/config/IshcConfig.java

@ -0,0 +1,44 @@
/*
* Copyright (C), 2018-2021
* Project: starter
* FileName: IshcConfig
* Author: xx
* Date: 2021/3/30 9:38
*/
package com.fr.plugin.ishc.config;
import com.fanruan.api.util.StringKit;
import com.fr.config.*;
import com.fr.config.holder.Conf;
import com.fr.config.holder.factory.Holders;
/**
* <Function Description><br>
* <IshcConfig>
*
* @author xx
* @since 1.0.0
*/
@Visualization(category = "Plugin-ishc_Group")
public class IshcConfig extends DefaultConfiguration {
public static final String PLUGIN_ID = "com.fr.plugin.ishc.sso";
private static volatile IshcConfig config = null;
@Identifier(value = "uriBase", name = "Plugin-ishc_Config_UriBase", description = "Plugin-ishc_Config_UriBase_Description", status = Status.SHOW)
private final Conf<String> uriBase = Holders.simple(StringKit.EMPTY);
public static IshcConfig getInstance() {
if (config == null) {
config = ConfigContext.getConfigInstance(IshcConfig.class);
}
return config;
}
public String getUriBase() {
return uriBase.get();
}
public void setUriBase(String uriBase) {
this.uriBase.set(uriBase);
}
}

203
src/main/java/com/fr/plugin/ishc/request/OAuthLogin.java

@ -0,0 +1,203 @@
/*
* Copyright (C), 2018-2021
* Project: starter
* FileName: OAuthLogin
* Author: xx
* Date: 2021/3/30 22:09
*/
package com.fr.plugin.ishc.request;
import com.fanruan.api.decision.login.LoginKit;
import com.fanruan.api.decision.user.UserKit;
import com.fanruan.api.i18n.I18nKit;
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.authority.data.User;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.privilege.TransmissionTool;
import com.fr.decision.webservice.bean.user.UserBean;
import com.fr.decision.webservice.utils.DecisionServiceConstants;
import com.fr.decision.webservice.utils.WebServiceUtils;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.json.JSONObject;
import com.fr.plugin.context.PluginContexts;
import com.fr.plugin.ishc.config.IshcConfig;
import com.fr.stable.core.UUID;
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.util.HashMap;
import java.util.Map;
import static com.fr.plugin.ishc.config.IshcConfig.PLUGIN_ID;
/**
* <Function Description><br>
* <OAuthLogin>
*
* @author xx
* @since 1.0.0
*/
@Authorize(callSignKey = PLUGIN_ID)
public class OAuthLogin extends AbstractGlobalRequestFilterProvider {
public static final String YL_TOKEN = "YL_TOKEN";
public static final String YL_USER = "YL_USER";
public static final String YL_APP_CODE = "YL_APP_CODE";
private IshcConfig config;
/**
* 过滤器名称
*
* @return
*/
@Override
public String filterName() {
return "ishcFilter";
}
/**
* 过滤规则
*
* @return
*/
@Override
public String[] urlPatterns() {
if (PluginContexts.currentContext() == null || !PluginContexts.currentContext().isAvailable()) {
LogKit.error(I18nKit.getLocText("Plugin-ishc_Licence_Expired"));
return new String[]{};
}
return new String[]{"/decision/view/form", "/decision/view/report", "/decision/v10/entry/access/*"};
}
/**
* 过滤器初始化
*
* @param filterConfig
*/
@Override
public void init(FilterConfig filterConfig) {
this.config = IshcConfig.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 {
// 管理员放行
try {
User currentUser = UserService.getInstance().getUserByRequestCookie(req);
if (UserService.getInstance().isAdmin(currentUser.getId())) {
return true;
}
} catch (Exception e) {
}
String pathInfo = (req.getPathInfo() != null) ? req.getPathInfo() : StringKit.EMPTY;
if (pathInfo.startsWith("/v10/entry/access")) {
WebUtils.printAsString(res, WebServiceUtils.generateErrorWebPage("非管理员,无权限访问此页面", StringKit.EMPTY, StringKit.EMPTY));
return false;
}
if (StringKit.isBlank(WebUtils.getHTTPRequestParameter(req, "viewlet"))) {
return true;
}
// LogKit.info("ishc-OAuthLogin-operation-url:{}", WebUtils.getOriginalURL(req));
String tokenYL = getWebParam(req, YL_TOKEN);
String userYL = getWebParam(req, YL_USER);
String appCodeYL = getWebParam(req, YL_APP_CODE);
String templateName = WebUtils.getReportTitleFromRequest(req);
if (StringKit.isBlank(tokenYL) || StringKit.isBlank(userYL) || StringKit.isBlank(appCodeYL) || StringKit.isBlank(templateName)) {
WebUtils.printAsString(res, WebServiceUtils.generateErrorWebPage("无认证参数,无权限访问此页面", StringKit.EMPTY, StringKit.EMPTY));
return false;
}
JSONObject result = authJMS(tokenYL, userYL, appCodeYL, templateName);
if (!StringKit.equals(result.getString("code"), "1")) {
printErrorPage(res, result);
return false;
}
if (!UserKit.existUsername(userYL)) {
UserBean userBean = new UserBean();
userBean.setUsername(userYL);
userBean.setPassword(TransmissionTool.defaultEncrypt(UUID.randomUUID().toString()));
userBean.setRealName(userYL);
UserService.getInstance().addUser(userBean);
}
String tokenFR = LoginKit.login(req, res, userYL);
req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR);
return true;
}
private void printErrorPage(HttpServletResponse res, JSONObject result) throws Exception {
String errorMsg;
if (StringKit.equals(result.getString("code"), "403")) {
errorMsg = "您的菜单权限已被收回,请联系上级管理员";
} else if (StringKit.equals(result.getString("code"), "401")) {
errorMsg = "长时间未操作,请重新登录";
} else if (StringKit.equals(result.getString("code"), "405")) {
errorMsg = "您的账号已在其他设备登录,请注意账号安全";
} else {
errorMsg = result.getString("msg");
}
WebUtils.printAsString(res, WebServiceUtils.generateErrorWebPage(errorMsg, StringKit.EMPTY, StringKit.EMPTY));
}
private String getWebParam(HttpServletRequest req, String paramName) {
if (StringKit.isNotBlank(req.getHeader(paramName))) {
return req.getHeader(paramName);
}
return NetworkKit.getHTTPRequestParameter(req, paramName);
}
/**
* 通过凭证获得code
*
* @param tokenYL
* @param userYL
* @param appCodeYL
* @param templateName
* @return
*/
private JSONObject authJMS(String tokenYL, String userYL, String appCodeYL, String templateName) throws Exception {
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put(YL_TOKEN, tokenYL);
headers.put(YL_USER, userYL);
headers.put(YL_APP_CODE, appCodeYL);
Map<String, String> params = new HashMap<>();
params.put("templateName", templateName);
LogKit.info("ishc-OAuthLogin-authJMS-headers:{}, params:{}", headers, params);
String res = HttpKit.get(this.config.getUriBase(), params, headers);
LogKit.info("ishc-OAuthLogin-authJMS-res:{}", res);
if (StringKit.isBlank(res)) {
return JSONObject.EMPTY;
}
return new JSONObject(res);
}
}

5
src/main/resources/com/fr/plugin/ishc/locale/lang.properties

@ -0,0 +1,5 @@
Plugin-ishc=Sso Plugin
Plugin-ishc_Group=Sso Plugin
Plugin-ishc_Config_UriBase=Uri Base
Plugin-ishc_Config_UriBase_Description=Uri Base
Plugin-ishc_Licence_Expired=Sso Plugin Licence Expired

5
src/main/resources/com/fr/plugin/ishc/locale/lang_zh_CN.properties

@ -0,0 +1,5 @@
Plugin-ishc=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
Plugin-ishc_Group=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
Plugin-ishc_Config_UriBase=\u5355\u70B9\u63A5\u53E3\u5730\u5740
Plugin-ishc_Config_UriBase_Description=\u5355\u70B9\u63A5\u53E3\u5730\u5740
Plugin-ishc_Licence_Expired=\u5355\u70B9\u767B\u9646\u63D2\u4EF6\u8BB8\u53EF\u8FC7\u671F
Loading…
Cancel
Save