diff --git a/src/com/api/organization/web/ConfigController.java b/src/com/api/organization/web/ConfigController.java new file mode 100644 index 00000000..b2a0f27b --- /dev/null +++ b/src/com/api/organization/web/ConfigController.java @@ -0,0 +1,13 @@ +package com.api.organization.web; + +import javax.ws.rs.Path; + +/** + * @Author liang.cheng + * @Date 2023/8/18 2:34 PM + * @Description: + * @Version 1.0 + */ +@Path("/bs/hrmorganization/config") +public class ConfigController extends com.engine.organization.web.ConfigController { +} diff --git a/src/com/engine/organization/entity/config/params/QTXConfigParam.java b/src/com/engine/organization/entity/config/params/QTXConfigParam.java new file mode 100644 index 00000000..23498bc7 --- /dev/null +++ b/src/com/engine/organization/entity/config/params/QTXConfigParam.java @@ -0,0 +1,33 @@ +package com.engine.organization.entity.config.params; + +import lombok.*; + +/** + * @Author liang.cheng + * @Date 2023/8/18 3:38 PM + * @Description: + * @Version 1.0 + */ + +@Data +@Builder +@AllArgsConstructor +@EqualsAndHashCode(callSuper=false) +public class QTXConfigParam { + + public QTXConfigParam() { + this.type = "1"; + this.domainIndex = "0"; + this.whole = "0"; + } + + private String loginId; + + private String type; + + private String domainIndex; + + private String whole; + + private String userAgent; +} diff --git a/src/com/engine/organization/entity/config/po/QTXConfigPO.java b/src/com/engine/organization/entity/config/po/QTXConfigPO.java new file mode 100644 index 00000000..fbd618b0 --- /dev/null +++ b/src/com/engine/organization/entity/config/po/QTXConfigPO.java @@ -0,0 +1,37 @@ +package com.engine.organization.entity.config.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2023/8/18 3:34 PM + * @Description: + * @Version 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class QTXConfigPO { + + private Integer id; + + private String appSecret; + + private String url; + + private String pcAddress; + + private String mobileAddress; + + private String secondUrl; + + private Integer creator; + + private String createDate; + + +} diff --git a/src/com/engine/organization/enums/MobileTerminalEnum.java b/src/com/engine/organization/enums/MobileTerminalEnum.java new file mode 100644 index 00000000..1f6b09ed --- /dev/null +++ b/src/com/engine/organization/enums/MobileTerminalEnum.java @@ -0,0 +1,32 @@ +package com.engine.organization.enums; + +/** + * @Author liang.cheng + * @Date 2023/8/18 4:29 PM + * @Description: 移动端类型 + * @Version 1.0 + */ +public enum MobileTerminalEnum { + Android, + iPhone, + iPad, + Mobile; + + + /** + * 判断字符串是否包含某个枚举值 + * @param str + * @return + */ + public static boolean containsEnumValue(String str) { + for (MobileTerminalEnum myEnum : MobileTerminalEnum.values()) { + if (str.contains(myEnum.toString())) { + return true; + } + } + return false; + } + +} + + diff --git a/src/com/engine/organization/mapper/config/ConfigMapper.java b/src/com/engine/organization/mapper/config/ConfigMapper.java new file mode 100644 index 00000000..f15a6e66 --- /dev/null +++ b/src/com/engine/organization/mapper/config/ConfigMapper.java @@ -0,0 +1,21 @@ +package com.engine.organization.mapper.config; + + +import com.engine.organization.entity.config.po.QTXConfigPO; + +/** + * 企通学配置Mapper + */ +public interface ConfigMapper { + + + /** + * @Description: 获取配置信息 + * @Author: liang.cheng + * @Date: 2023/8/18 5:01 PM + * @param: [] + * @return: com.engine.organization.entity.config.po.QTXConfigPO + */ + QTXConfigPO selectConfigInfo(); + +} diff --git a/src/com/engine/organization/mapper/config/ConfigMapper.xml b/src/com/engine/organization/mapper/config/ConfigMapper.xml new file mode 100644 index 00000000..3cb7cf57 --- /dev/null +++ b/src/com/engine/organization/mapper/config/ConfigMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + t.id + , t.app_secret + , t.url + , t.pc_address + , t.mobile_address + , t.second_url + , t.creator + , t.create_date + + + + + + \ No newline at end of file diff --git a/src/com/engine/organization/service/ConfigService.java b/src/com/engine/organization/service/ConfigService.java new file mode 100644 index 00000000..1ee70415 --- /dev/null +++ b/src/com/engine/organization/service/ConfigService.java @@ -0,0 +1,23 @@ +package com.engine.organization.service; + +import com.engine.organization.entity.config.params.QTXConfigParam; + +import java.io.UnsupportedEncodingException; + +/** + * @Author liang.cheng + * @Date 2023/8/18 2:35 PM + * @Description: + * @Version 1.0 + */ +public interface ConfigService { + + /** + * @Description: 企通学单点地址 + * @Author: liang.cheng + * @Date: 2023/8/18 4:06 PM + * @param: [qtxConfigParam] + * @return: java.lang.String + */ + String ssoLogin(QTXConfigParam qtxConfigParam) throws UnsupportedEncodingException; +} diff --git a/src/com/engine/organization/service/impl/ConfigServiceImpl.java b/src/com/engine/organization/service/impl/ConfigServiceImpl.java new file mode 100644 index 00000000..d893755d --- /dev/null +++ b/src/com/engine/organization/service/impl/ConfigServiceImpl.java @@ -0,0 +1,88 @@ +package com.engine.organization.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.engine.core.impl.Service; +import com.engine.organization.entity.config.params.QTXConfigParam; +import com.engine.organization.entity.config.po.QTXConfigPO; +import com.engine.organization.enums.MobileTerminalEnum; +import com.engine.organization.mapper.config.ConfigMapper; +import com.engine.organization.service.ConfigService; +import com.engine.organization.util.db.MapperProxyFactory; +import org.apache.commons.codec.binary.Base64; +import weaver.general.BaseBean; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * @Author liang.cheng + * @Date 2023/8/18 2:38 PM + * @Description: + * @Version 1.0 + */ +public class ConfigServiceImpl extends Service implements ConfigService { + + private static ConfigMapper getConfigMapper() { + return MapperProxyFactory.getProxy(ConfigMapper.class); + } + + + @Override + public String ssoLogin(QTXConfigParam qtx) throws UnsupportedEncodingException { + String hkUrl; + BaseBean bb = new BaseBean(); + String enable = bb.getPropValue("qtx_sso_login", "enable"); + String userAgent = qtx.getUserAgent(); + boolean termianal = MobileTerminalEnum.containsEnumValue(userAgent); + if (Boolean.parseBoolean(enable)) { + QTXConfigPO qtxConfig = getConfigMapper().selectConfigInfo(); + String domain = "0".equals(qtx.getDomainIndex()) ? qtxConfig.getUrl() : qtxConfig.getSecondUrl(); + String address = termianal ? qtxConfig.getMobileAddress() : qtxConfig.getPcAddress(); + String accessKey = URLEncoder.encode(getAccessKey(qtxConfig.getAppSecret()),"utf-8"); + hkUrl = StrUtil.format("{}/{}?accessKey={}&type={}&username={}&whole={}",domain,address,accessKey,qtx.getType(),qtx.getLoginId(),qtx.getWhole()); + }else { + String accessKey = URLEncoder.encode(getAccessKey(bb.getPropValue("qtx_sso_login", "app_secret")),"utf-8"); + String domain = "0".equals(qtx.getDomainIndex()) ? bb.getPropValue("qtx_sso_login","url") : bb.getPropValue("qtx_sso_login","url1"); + String address = termianal ? bb.getPropValue("qtx_sso_login","h5address") : bb.getPropValue("qtx_sso_login","pcaddress"); + hkUrl = StrUtil.format("{}/{}?accessKey={}&type={}&username={}&whole={}",domain,address,accessKey,qtx.getType(),qtx.getLoginId(),qtx.getWhole()); + } + return hkUrl; + } + + private static String getAccessKey(String appSecret) { + String data = System.currentTimeMillis() + "||" + appSecret; + String IV = appSecret.substring(appSecret.length() - 16); + String keys = appSecret.substring(0, 16); + return encryptData(data, keys, IV); + } + + /** + * @Description: AES加密 + * @Author: liang.cheng + * @Date: 2023/8/18 4:45 PM + * @param: [data, key, IV] + * @return: java.lang.String + */ + private static String encryptData(String data, String key, String IV) { + try { + //算法/模式/填充模式 AES/CBC/PKCS5Padding + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + int plaintextLength = dataBytes.length; + byte[] plaintext = new byte[plaintextLength]; + System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); + SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); + IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); + byte[] encrypted = cipher.doFinal(plaintext); + //输出内容,Base64处理 + return new String(Base64.encodeBase64(encrypted)); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/com/engine/organization/web/ConfigController.java b/src/com/engine/organization/web/ConfigController.java new file mode 100644 index 00000000..f357e57f --- /dev/null +++ b/src/com/engine/organization/web/ConfigController.java @@ -0,0 +1,44 @@ +package com.engine.organization.web; + +import com.engine.common.util.ServiceUtil; +import com.engine.organization.entity.config.params.QTXConfigParam; +import com.engine.organization.service.ConfigService; +import com.engine.organization.service.impl.ConfigServiceImpl; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import java.io.IOException; + +/** + * @Author liang.cheng + * @Date 2023/8/18 2:29 PM + * @Description: 配置入口 + * @Version 1.0 + */ +public class ConfigController { + + + public ConfigService getConfigService(User user) { + return ServiceUtil.getService(ConfigServiceImpl.class,user); + } + + + + + @GET + @Path("/ssoLogin") + public void ssoLogin(@Context HttpServletRequest request, @Context HttpServletResponse response, + @QueryParam("type") String type,@QueryParam("domainIndex") String domainIndex,@QueryParam("whole") String whole) throws IOException { + User user = HrmUserVarify.getUser(request, response); + QTXConfigParam qtxConfigParam = QTXConfigParam.builder().loginId(user.getLoginid()).type(type).domainIndex(domainIndex).whole(whole) + .userAgent(request.getHeader("user-agent")).build(); + String url = getConfigService(user).ssoLogin(qtxConfigParam); + response.sendRedirect(url); + } +}