当前位置: 首页 > 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 接口直接开发重定向

http://www.xdnf.cn/news/1028503.html

相关文章:

  • Python基础补漏
  • ESP32服务器端编码
  • SAM分割一切-使用SAM自动生成对象掩码示例
  • NB/T 32004-2018测试是什么,光伏并网逆变器NB/T 32004测试项目
  • ServiceNow培训第1期
  • MATLAB实现图像纹理特征提取
  • PMP证-介绍
  • 准确--使用 ThinBackup 插件执行备份和恢复
  • Python训练营打卡 Day53
  • 华为数字化转型进阶——精读188页华为EBPM数字化全要素流程管理方法论【附全文阅读】
  • rocketmq producer和consumer连接不同的集群,如何隔离
  • 渗透实战:利用XSS获取cookie和密码
  • JDBC基础关键_002_JDBC 增删改
  • ​​Promise代码理解
  • 如何通过Python从DEM文件生成坡度和坡向数据
  • 读取OpenFOAM二进制polyMesh格式的C/C++程序
  • 手搓中文字符编程语言
  • 一文掌握 Windows 文件传输:5 种命令行工具的原理、参数与示例
  • 中国人工智能证书综合信息表(2025年版)
  • 基于混合预编码的同时进行无线信息和功率传输的毫米波海量MIMO-NOMA
  • 如何确保邮件群发不会被标记为垃圾邮件?
  • 【测试开发】函数高阶-闭包、装饰器
  • P25:LSTM实现糖尿病探索与预测
  • Spring AOP与代理模式
  • 利用 Python 爬虫按关键字搜索 1688 商品
  • mvnd-快速打包maven项目
  • 如何使用自动化测试来提高接口测试的效率
  • 1Panel 618 年中大促|不止半价!
  • 《二叉堆》题集
  • Ubuntu VMware虚拟机卡在/dev/sda1