当前位置: 首页 > news >正文

E10集成登录三方系统

文章目录

  • 一、概述
  • 二、实现方案
      • 方案一:集成登录 + ESB 纯配置方式
      • 方案二:集成登录 + 自定义单点实现类
      • 方案三:Rest接口重定向
  • 三、总结

一、概述

需求背景:E10 单点登录三方 KMS 系统,提供了获取 Token 的接口与单点登录地址

二、实现方案

方案一:集成登录 + ESB 纯配置方式


1.首先在ESB中心创建一个新的连接器

在这里插入图片描述
2.点击连接器新建连接信息与接口

📖 连接器

在这里插入图片描述

📖 接口

编辑接口的基础信息,不用携带接口的域名或IP直接输入接口地址即可,选择请求方式

在这里插入图片描述

下一步,新建请求参数,此处只需要传用户手机号即可

在这里插入图片描述

下一步,编辑三方接口的响应参数

在这里插入图片描述

下一步,编辑请求成功或失败的标识

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后保存后的效果

在这里插入图片描述
检查完连接和接口信息后,发现此时接口处于维护状态,需要手动发布一下,这样后面才能选到

在这里插入图片描述

3.新建ESB动作流

选择自定义事件触发 >> 自定义触发

在这里插入图片描述

选择输入参数

在这里插入图片描述
在这里插入图片描述

点击加号添加操作 >> 选择全部操作 >> 选择我们刚才配置的连接器和接口

在这里插入图片描述
在这里插入图片描述

配置输入参数 >> 将参数设置成动态取值 >> 找到系统参数的当前用户手机号码 >> 然后保存即可

在这里插入图片描述
在这里插入图片描述

配置输出参数 >> 创建我们需要通过接口返回的参数 >> 设置动态取值 >> 选择上下文连接器响应参数里的令牌

在这里插入图片描述
在这里插入图片描述

最后保存并启用

4.配置集成登录

找到集成登录 >> 选择空白模版新建 >> 填写基本信息

在这里插入图片描述

关联我们创建的动作流 >> 动作流的输入参数设置为用户手机号 >> 新建自定义参数,用于单点三方地址使用 >> 设置参数取值为动作流输出参数,将其中 token 赋值给我们的URL参数 token

在这里插入图片描述
保存后可以获得单点登录的地址,配置到门户即可

在这里插入图片描述

方案二:集成登录 + 自定义单点实现类

当套件类型为自定义时,可以配置自定义单点实现类

在这里插入图片描述

package com.weaver.intlogin.sdk.dcengine.customlogin.impl;import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.weaver.intlogin.common.constant.CustomLoginConstant;
import com.weaver.intlogin.configs.IntLoginConfig;
import com.weaver.intlogin.sdk.dcengine.customlogin.IntLoginServices;
import com.weaver.intlogin.sdk.dcengine.customlogin.enums.LoginCode;
import com.weaver.intlogin.sdk.dcengine.customlogin.enums.LoginType;
import com.weaver.intlogin.sdk.dcengine.customlogin.enums.RequestMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.HashMap;
import java.util.Map;public class DemoCustomIntLoginServices implements IntLoginServices {private final Logger log = LoggerFactory.getLogger(this.getClass());private String msg;// 提示信息private String code;// 200 表示单点生成成功,其他则为失败private IntLoginConfig config;// 集成登录上下文对象private String requestMethod;// 请求方式 get,postprivate Map params; // 在集成登录页面配置的参数列表private String loginType;//0表示地址模式,1表示app模式// 地址模式的单点逻辑@Overridepublic JSONObject execute() {JSONObject result = new JSONObject();result.put(CustomLoginConstant.LOGINURL, "http://ip:port");result.put(CustomLoginConstant.MSG, "");result.put(CustomLoginConstant.CODE, LoginCode.Normal.getCode());result.put(CustomLoginConstant.REQUESTMETHOD, RequestMethod.GET.getName());result.put(CustomLoginConstant.PARAMS, params);//如果单点参数有变化,可替换为自行处理后的参数map集合变量result.put(CustomLoginConstant.LOGINTYPE, LoginType.ADDRESS.getCode());//如果单点参数有变化,可替换为自行处理后的参数map集合变量String loginUrl = "http://www.baidu.com";// 从参数列表中获取手机号String phone = "";if (params.containsKey("phone")) {phone = String.valueOf(params.get("phone"));}log.error("phone ---> " + phone);// 校验if ("".equals(phone)) {result.put(CustomLoginConstant.CODE, LoginCode.RequestExp.getCode());result.put(CustomLoginConstant.MSG, "手机号为空,请核对人员信息!");return result;}// 获取 tokenString tokenResponse = HttpRequest.post("http://ip:port/restApi/getToken?phone=" + phone).timeout(60000).body(JSON.toJSONString(new HashMap<>())).execute().body();log.error("tokenResponse ---> " + tokenResponse);JSONObject tokenJson = JSON.parseObject(tokenResponse);String code = tokenJson.getOrDefault("code", "").toString();String msg = tokenJson.getOrDefault("msg", "").toString();String token = tokenJson.getOrDefault("token", "").toString();if ("".equals(token)) {result.put(CustomLoginConstant.CODE, LoginCode.ServiceExp.getCode());result.put(CustomLoginConstant.MSG, "获取Token失败!");return result;}result.put(CustomLoginConstant.LOGINURL, "http://ip:port?token=" + token);log.error("result ---> " + result);return result;}// APP 模式的单点逻辑@Overridepublic JSONObject executeMobile() {JSONObject reslut = new JSONObject();reslut.put(CustomLoginConstant.MSG, "");reslut.put(CustomLoginConstant.CODE, LoginCode.Normal.getCode());reslut.put(CustomLoginConstant.REQUESTMETHOD, RequestMethod.GET.getName());reslut.put(CustomLoginConstant.PARAMS, params);//如果单点参数有变化,可替换为自行处理后的参数map集合变量reslut.put(CustomLoginConstant.LOGINTYPE, LoginType.APP.getCode());//如果单点参数有变化,可替换为自行处理后的参数map集合变量reslut.put(CustomLoginConstant.APPDOWNLOADURLANDROID, "weixin://");//安卓下载地址reslut.put(CustomLoginConstant.APPACCESSURLIOS, "weixin://");//ios单点地址reslut.put(CustomLoginConstant.APPACCESSURLANDROID, "weixin://");//安卓单点地址reslut.put(CustomLoginConstant.APPDOWNLOADURLIOS, "weixin://");//ios下载地址log.error("tc----reslut:" + reslut);return reslut;}@Overridepublic void setParams(Map params) {this.params = params;}@Overridepublic void setConfig(IntLoginConfig config) {this.config = config;}@Overridepublic void setRequestMethod(String requestMethod) {this.requestMethod = requestMethod;}@Overridepublic void setLoginType(String loginType) {this.loginType = loginType;}@Overridepublic JSONObject execute(Map data) {return null;}@Overridepublic void setExecuteCode(int code) {}@Overridepublic int getExecuteCode() {return 0;}
}

方案三:Rest接口重定向


数据库操作工具类

package com.weaver.seconddev.xxx.helper;import cn.hutool.core.codec.Base64;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.weaver.ebuilder.datasource.api.entity.ExecuteSqlEntity;
import com.weaver.ebuilder.datasource.api.enums.SourceType;
import com.weaver.ebuilder.datasource.api.service.DataSetService;
import com.weaver.workflow.common.util.DataTransUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
public class DbHelper {// select insert update// 固定字段 id ,delete_type ,tenant_key ,create_time ,update_time// delete ==>   update  eteams.employee  delete_type = 0  1 逻辑删除  3 物理删除// where  tenant_key ='xxxx' and  delete_type = 0// insert create_time// update update_timeprivate Map<String, String> logicGroupMap = null;private Map<String, String> externalGroupMap = null;@Autowiredprivate DataSetService dataSetService;public boolean clearGroup() {logicGroupMap = null;externalGroupMap = null;return true;}/*** 获取外部数据源信息** @param dbName* @return*/public String getExternalGroupIdByName(String dbName) {if (externalGroupMap == null) {List<Map<String, Object>> dataGroups = dataSetService.getDataGroups(SourceType.EXTERNAL, false);externalGroupMap = new HashMap<>();for (Map<String, Object> dataGroup : dataGroups) {String name = DataTransUtil.null2String(dataGroup.get("name"));String id = DataTransUtil.null2String(dataGroup.get("id"));if (!name.isEmpty() && !id.isEmpty()) {externalGroupMap.put(name, id);}}}return DataTransUtil.null2String(externalGroupMap.get(dbName));}/*** 获取内部模块数据源信息** @param dbName* @return*/public String getLogicGroupIdByName(String dbName) {if (logicGroupMap == null) {List<Map<String, Object>> dataGroups = dataSetService.getDataGroups(SourceType.LOGIC, false);logicGroupMap = new HashMap<>();for (Map<String, Object> dataGroup : dataGroups) {String id = DataTransUtil.null2String(dataGroup.get("id"));if (!id.isEmpty()) {logicGroupMap.put(id, id);}}}return DataTransUtil.null2String(logicGroupMap.get(dbName));}/*** 执行查询sql 返回数据** @param groupId* @param sql* @param sourceType LOGIC:内部  EXTERNAL:外部* @return*/public List<Map<String, Object>> selectBySql(String groupId, String sql, SourceType sourceType) {List<Map<String, Object>> mapList = Lists.newArrayList();ExecuteSqlEntity entity = new ExecuteSqlEntity();entity.setSourceType(sourceType);entity.setGroupId(groupId);entity.setSql(Base64.encode(sql));Map<String, Object> external = dataSetService.executeSql(entity);if (external.containsKey("records")) {JSONArray records = JSONArray.parseArray(JSON.toJSONString(external.get("records")));for (int i = 0; i < records.size(); i++) {JSONObject jsonObject = records.getJSONObject(i);Map<String, Object> map = Maps.newHashMap();for (String s : jsonObject.getInnerMap().keySet()) {map.put(s, jsonObject.get(s));}mapList.add(map);}}return mapList;}/*** 执行sql 不返回数据* @param groupId* @param sql* @param sourceType LOGIC:内部  EXTERNAL:外部* @return*/public boolean executeSql(String groupId, String sql, SourceType sourceType) {ExecuteSqlEntity entity = new ExecuteSqlEntity();entity.setSourceType(sourceType);entity.setGroupId(groupId);entity.setSql(Base64.encode(sql));Map<String, Object> external = dataSetService.executeSql(entity);return true;}
}

Controller 实现重定向到三方页面

package com.weaver.seconddev.xxx.controller.sso;import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.weaver.common.authority.annotation.WeaPermission;
import com.weaver.ebuilder.datasource.api.enums.SourceType;
import com.weaver.seconddev.easpring.helper.DbHelper;
import com.weaver.teams.security.context.TenantContext;
import com.weaver.teams.security.context.UserContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api/secondev")
@WeaPermission(publicPermission = true)
@Slf4j
public class KMSSsoLoginController {@AutowiredDbHelper dbHelper;@GetMapping("/ssoLogin")public String ssoLogin(HttpServletResponse response) {log.error("KMSSsoLoginController ssoLogin 单点登录 KMS 系统");try {// 获取用户信息String tenantKey = TenantContext.getCurrentTenantKey();Long employeeId = UserContext.getCurrentUser().getEmployeeId();String groupId = "978899289914765312";log.error("tenantKey ---> " + tenantKey + "  employeeId ---> " + employeeId + "  groupId ---> " + groupId);// 查询人员工号String querySQL = "select job_num from eteams.employee where id = '" + employeeId + "' and tenant_key = '" + tenantKey + "' and delete_type = 0";List<Map<String, Object>> queryRes = dbHelper.selectBySql(groupId, querySQL, SourceType.EXTERNAL);String workcode = "";if (!queryRes.isEmpty()) {Map<String, Object> queryMap = queryRes.get(0);workcode = String.valueOf(queryMap.get("job_num"));}log.error("workcode ---> " + workcode);// 处理系统管理员账号if ("sysadmin".equals(workcode)) {return "账号不存在";}// 调用接口获取 TokenString tokenResponse = HttpRequest.post("http://ip:port/auth/token/oAToken?userName=" + workcode).timeout(60000).body(JSON.toJSONString(new HashMap<>())).execute().body();log.error("tokenResponse ---> " + tokenResponse);JSONObject tokenJson = JSON.parseObject(tokenResponse);String code = tokenJson.getOrDefault("code", "").toString();String msg = tokenJson.getOrDefault("msg", "").toString();if (!"0".equals(code)) {return msg;}// 解析 TokenObject dataObj = tokenJson.get("data");JSONObject data = new JSONObject();if (dataObj instanceof JSONObject) {data = (JSONObject) dataObj;} else if (dataObj instanceof String) {return String.valueOf(dataObj);}String accessToken = data.getOrDefault("access_token", "").toString();log.error("accessToken ---> " + accessToken);// 重定向response.sendRedirect("http://ip:port/sso?token=" + accessToken);return "";} catch (Exception e) {e.printStackTrace();log.error("KMSSsoLoginController ssoLogin 程序出错 ---> " + e.getClass().getName() + "  具体信息 ---> " + e.getMessage());return "KMSSsoLoginController ssoLogin 程序出错 ---> " + e.getClass().getName() + "  具体信息 ---> " + e.getMessage();}}
}

三、总结


对于简单的推荐集成登录直接配置
如果人员对应关系比较复杂推荐集成登录选择自定义模版,采用后端实现集成登录接口
没有相关非标或标准不支持,可以通过 Controller 接口直接开发重定向

相关文章:

  • 深度学习神经网络架构Transformer深刻理解
  • 砂石骨料数字孪生工厂应用案例:远眺科技三维可视化落地成效
  • Vue3 + Element Plus中el-table加载状态分析
  • 4步使用 vue3 路由
  • Java机器学习全攻略:从基础原理到实战案例详解
  • 【IEEE/EI/Scopus检索】2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025)
  • C# 结构(属性和字段初始化语句和结构是密封的)
  • 机器学习算法_聚类KMeans算法
  • Mac电脑数据恢复工具-Disk 企业版
  • 使用 ollama 在 mac 本地部署一个 qwen3:8b 模型
  • mac安装mvnd结合idea
  • Wi-Fi 6 在 2.4GHz 频段的速率与优化分析
  • 数据可视化——一图胜千言
  • Kafka环境搭建全攻略:从Docker到Java实战
  • Visual Studio Code 1.101.0 官方版
  • 列举开源的模型和推理框架
  • 【Java学习笔记】集合介绍
  • .NetCore 8 反射与源生成器(Reflection vs Source Generators)
  • aflplusplus:开源的模糊测试工具!全参数详细教程!Kali Linux教程!(二)
  • C# .NET Core 源代码生成器(dotnet source generators)
  • 学校网站风格/鸡西seo
  • 自己搭建聊天平台/贵港seo关键词整站优化
  • 沧州疫情最新消息今天封城/seo网站首页推广
  • 收购域名/长沙关键词优化平台
  • 北京建设局网站/永久免费开网店app
  • wordpress图片宽度/东莞seo管理