diff --git a/stwzhj-api/stwzhj-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/stwzhj-api/stwzhj-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java index b71eaa85..6ccabcfa 100644 --- a/stwzhj-api/stwzhj-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java +++ b/stwzhj-api/stwzhj-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java @@ -52,6 +52,8 @@ public interface RemoteUserService { */ LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException; + LoginUser getUserInfoByIdCard(String idCard, String tenantId) throws UserException; + /** * 通过openid查询用户信息 * diff --git a/stwzhj-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/stwzhj-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 3ac3bfdb..fffb1c78 100644 --- a/stwzhj-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/stwzhj-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -3,10 +3,12 @@ package org.dromara.auth.controller; import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.net.URLDecoder; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthResponse; @@ -19,8 +21,11 @@ import org.dromara.auth.domain.vo.LoginVo; import org.dromara.auth.domain.vo.TenantListVo; import org.dromara.auth.form.RegisterBody; import org.dromara.auth.form.SocialLoginBody; +import org.dromara.auth.form.SsoLoginBody; +import org.dromara.auth.properties.DsSsoProperties; import org.dromara.auth.service.IAuthStrategy; import org.dromara.auth.service.SysLoginService; +import org.dromara.auth.util.RSAUtil; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginBody; @@ -49,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; /** * token 控制 @@ -61,6 +67,8 @@ import java.util.concurrent.TimeUnit; public class TokenController { private final SocialProperties socialProperties; + + private final DsSsoProperties ssoProperties; private final SysLoginService sysLoginService; private final ScheduledExecutorService scheduledExecutorService; @@ -110,6 +118,55 @@ public class TokenController { return R.ok(loginVo); } + @RequestMapping("/jzLogin") + public void wjyLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{ + System.out.print("进入jzLogin"); + String userInfo = request.getParameter("userInfo"); + log.info("接收userInfo={}",userInfo); + String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMSmBCx1ghaVLT/x96ERi9lo3XY/dzKFc9y5f7RtPJihU6fijX4eFSNrhJAjnP2pkJfCXLEmaPznmoUfrUhmq3yeXNzRNILQ+XAUcGkX13oMqW9qM/u5ZHlBnBwMiCZVOZ4pmaZ+hgA8jiNjhh1AqBkRpbvlfnlyC0fBv5FcXOQ3AgMBAAECgYBhfp2bHTc90v/4MBLBfF2FkIQb2CNUnO1whVdXMMFWOsWq+puD5447XVb/z2hKKwNQ+j/SZGSw3nKxhZ73wk9KPkGo9o4gjdwbgo6Qnk8sGQFpCg+5aFH1CgMy5PaM2ZcxbPOfO7tardS1D9u3Vm88688Qdk5sLLWkf6JuNP6LIQJBAPQ4w4qMOfI7Uss90A7/SGHWUjzLvsEv5eq/jXpRhJnyX5tHDCgPCq4CQKwBfUbzdapMtsf065aZCWZR51+V3g0CQQDOIeYX3TTDadzg/cC8tG/AVnxbsoY2Cy9fXmzJCfXIOxZPQIL1WF7HDveTXRxhp6CjSkzVcFJ9K1MFbl/WCf5TAkBqqawFg87/E5fKelm3Yxlq2Z8bPGU4nMHO8BBLXvUKA4hsGfCeQkuIyiUSuqfLaCN42H5wAHEwWfB4BseFwL+1AkBgqfrp4/0TSnifNcAFfiQNsUD+C1juzQ35DiG7oSUWMcdDgQAop7lCZd1pyLc/gElPac9gJB06v29eU6UzjVorAkEAymdUmrgcezAi+aMA0+QcenvPiom3jQkduvfBjOiSLSWm5oB8+mMlExl8Vm9FtKMms6zOs/LcTZzxonl//oe4Ag=="; + com.alibaba.fastjson.JSONObject json = null; + if (needsUrlDecode(userInfo)){ + byte[] b1 = RSAUtil.decrypt(privateKey, URLDecoder.decode(userInfo, StandardCharsets.UTF_8)); + json = com.alibaba.fastjson.JSONObject.parseObject(new String(b1)); + }else { + byte[] b1 = RSAUtil.decrypt(privateKey, userInfo); + json = com.alibaba.fastjson.JSONObject.parseObject(new String(b1)); + } + + log.info("解码后用户信息={}",json.toString()); + String identityNo = json.getString("cardNo"); +// String identityNo = "340321199705196996"; + /* String identityNo = request.getParameter("userInfo"); + String policeId = "999013";*/ + String clientId = "e5cd7e4891bf95d1d19206ce24a7b32e"; + String grantType = "sso"; + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + SsoLoginBody loginBody = new SsoLoginBody(); + loginBody.setClientId(clientId); + loginBody.setGrantType(grantType); + loginBody.setIdcard(identityNo); + LoginVo loginVo = IAuthStrategy.login(JsonUtils.toJsonString(loginBody), clientVo, grantType); + response.sendRedirect(ssoProperties.getRedirctUrl()+loginVo.getAccessToken()+"&clientId="+loginVo.getClientId()); + } + + + private static final Pattern ENCODED_PATTERN = Pattern.compile("%[0-9A-Fa-f]{2}"); + + /** + * 判断给定的字符串是否包含URL编码的内容(即可能需要解码) + * @param str 待检查的字符串 + * @return true 表示字符串包含URL编码模式,建议尝试解码;false 表示没有发现编码模式 + */ + public static boolean needsUrlDecode(String str) { + if (str == null || str.isEmpty()) { + return false; + } + return ENCODED_PATTERN.matcher(str).find(); + } + + + + /** * 第三方获取Token * diff --git a/stwzhj-auth/src/main/java/org/dromara/auth/form/SsoLoginBody.java b/stwzhj-auth/src/main/java/org/dromara/auth/form/SsoLoginBody.java new file mode 100644 index 00000000..f0d86ca7 --- /dev/null +++ b/stwzhj-auth/src/main/java/org/dromara/auth/form/SsoLoginBody.java @@ -0,0 +1,13 @@ +package org.dromara.auth.form; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +@Data +@EqualsAndHashCode(callSuper = true) +public class SsoLoginBody extends LoginBody { + + //身份证号码 + private String idcard; +} diff --git a/stwzhj-auth/src/main/java/org/dromara/auth/properties/DsSsoProperties.java b/stwzhj-auth/src/main/java/org/dromara/auth/properties/DsSsoProperties.java new file mode 100644 index 00000000..ffee0c34 --- /dev/null +++ b/stwzhj-auth/src/main/java/org/dromara/auth/properties/DsSsoProperties.java @@ -0,0 +1,24 @@ +package org.dromara.auth.properties; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "ds.sso") +public class DsSsoProperties { + + private String url; + + private String clientId; + + private String clientSecret; + + //返回前端的地址 + private String redirctUrl; + +} diff --git a/stwzhj-auth/src/main/java/org/dromara/auth/service/impl/SsoAuthStrategy.java b/stwzhj-auth/src/main/java/org/dromara/auth/service/impl/SsoAuthStrategy.java new file mode 100644 index 00000000..749a247b --- /dev/null +++ b/stwzhj-auth/src/main/java/org/dromara/auth/service/impl/SsoAuthStrategy.java @@ -0,0 +1,60 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SsoLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/* +* 单点登录 +* 不用密码 根据jwt解析到的身份证登录 +* */ +@Slf4j +@Service("sso" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SsoAuthStrategy implements IAuthStrategy { + + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + SsoLoginBody loginBody = JsonUtils.parseObject(body, SsoLoginBody.class); +// ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String idcard = loginBody.getIdcard(); + LoginUser loginUser = remoteUserService.getUserInfoByIdCard(idcard, tenantId); +// loginService.checkLogin(LoginType.PASSWORD, tenantId, username); //此处不需要验证 + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } +} diff --git a/stwzhj-auth/src/main/java/org/dromara/auth/util/RSAUtil.java b/stwzhj-auth/src/main/java/org/dromara/auth/util/RSAUtil.java new file mode 100644 index 00000000..c3a159e7 --- /dev/null +++ b/stwzhj-auth/src/main/java/org/dromara/auth/util/RSAUtil.java @@ -0,0 +1,215 @@ +package org.dromara.auth.util; + + +import cn.hutool.core.net.URLDecoder; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.regex.Pattern; + + +/** + * 非对称加密算法RSA算法组件 非对称算法一般是用来传送对称加密算法的密钥来使用的,相对于DH算法,RSA算法只需要一方构造密钥,不需要 + * 大费周章的构造各自本地的密钥对了。DH算法只能算法非对称算法的底层实现。而RSA算法算法实现起来较为简单 + * + * @author kfchen + * @version 1.0.1 + * @date 2019-09-12 + */ +public class RSAUtil { + + public static final String KEY_ALGORITHM = "RSA"; + + private static org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = null; + + /** + * 取唯一BouncyCastleProvider + * + * @return + */ + public static synchronized org.bouncycastle.jce.provider.BouncyCastleProvider getBcpInstance() { + if (bouncyCastleProvider == null) { + bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider(); + } + return bouncyCastleProvider; + } + + /** + * 私钥解密过程 + * + * @param privateKeyStr 私钥 + * @param data 密文数据 + * @return 明文 + * @throws Exception 解密过程中的异常信息 + */ + public static byte[] decryptForJSEncrypt(String privateKeyStr, String data) + throws Exception { + RSAPrivateKey privateKey = loadPrivateKeyByStr(privateKeyStr); + if (privateKey == null) { + throw new Exception("解密私钥为空, 请设置"); + } + Cipher cipher = null; + try { + // 使用默认RSA + cipher = Cipher.getInstance("RSA"); + byte[] cipherData = Base64.decodeBase64(data.getBytes()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] output = cipher.doFinal(cipherData); + return output; + } catch (NoSuchAlgorithmException e) { + throw new Exception("无此解密算法"); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + return null; + } catch (InvalidKeyException e) { + throw new Exception("解密私钥非法,请检查"); + } catch (IllegalBlockSizeException e) { + throw new Exception("密文长度非法"); + } catch (BadPaddingException e) { + throw new Exception("密文数据已损坏"); + } + } + + public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr) + throws Exception { + try { + byte[] buffer = Base64.decodeBase64(privateKeyStr); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return (RSAPrivateKey) keyFactory.generatePrivate(keySpec); + } catch (NoSuchAlgorithmException e) { + throw new Exception("无此算法"); + } catch (InvalidKeySpecException e) { + throw new Exception("私钥非法"); + } catch (NullPointerException e) { + throw new Exception("私钥数据为空"); + } + } + + /** + * * 解密 * + * + * @param privateKey 解密的密钥 * + * @param data 已经加密的数据 * + * @return 解密后的明文 * + * @throws Exception + */ + public static byte[] decrypt(String privateKey, String data) throws Exception { + try { + byte[] raw = decryptBASE64(data); + // 对密钥解密 + byte[] keyBytes = decryptBASE64(privateKey); + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey pk = keyFactory.generatePrivate(pkcs8KeySpec); + + Cipher cipher = Cipher.getInstance("RSA", getBcpInstance()); + cipher.init(cipher.DECRYPT_MODE, pk); + int blockSize = cipher.getBlockSize(); + ByteArrayOutputStream bout = new ByteArrayOutputStream(64); + int j = 0; + + while (raw.length - j * blockSize > 0) { + bout.write(cipher.doFinal(raw, j * blockSize, blockSize)); + j++; + } + return bout.toByteArray(); + } catch (Exception e) { + throw new Exception(e.getMessage()); + } + } + + /** + * 加密
+ * 用私钥加密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(data); + } + + /** + * base64解密 + */ + public static byte[] decryptBASE64(String key) { + return Base64.decodeBase64(key); + } + + /** + * base64加密 + */ + public static String encryptBASE64(byte[] bytes) { + return Base64.encodeBase64String(bytes); + } + + // 预编译正则表达式,匹配 % 后跟两个十六进制字符 + private static final Pattern ENCODED_PATTERN = Pattern.compile("%[0-9A-Fa-f]{2}"); + + /** + * 判断给定的字符串是否包含URL编码的内容(即可能需要解码) + * @param str 待检查的字符串 + * @return true 表示字符串包含URL编码模式,建议尝试解码;false 表示没有发现编码模式 + */ + public static boolean needsUrlDecode(String str) { + if (str == null || str.isEmpty()) { + return false; + } + return ENCODED_PATTERN.matcher(str).find(); + } + + /** + * main + */ + public static void main(String[] args) throws Exception { + String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7V+wyxy6D+lBNHfz1eSF7NJ3QSpAJ/9P+4uDv8w1MKm0lzQKmbNJEHaKr3zzQzlRrWdo675DuqVtCtMVCR1oha5ONEaxo8uYazTSOlLRVDEjL/JDcIQIL+1Zn7p/pu3UusmHVxQQTFftxK7MS6uWd/TeNr5sYmseT27922rNlVQIDAQAB";//RSACoder.getPublicKey(keyMap); +// String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALtX7DLHLoP6UE0d/PV5IXs0ndBKkAn/0/7i4O/zDUwqbSXNAqZs0kQdoqvfPNDOVGtZ2jrvkO6pW0K0xUJHWiFrk40RrGjy5hrNNI6UtFUMSMv8kNwhAgv7Vmfun+m7dS6yYdXFBBMV+3ErsxLq5Z39N42vmxiax5Pbv3bas2VVAgMBAAECgYA2KtzTbb3oUQbI1WPfge+JVRRQNk7hZUPhja3mEwuEOzwl0tnyTsKZCUyQj1JhOVc1Vtx/b+ci6nrFlcj3OfQ3+NXhShUSnAXopjlL/1TNA5WNDqqlG8R0IaA/zvqmcr9j55idGvGAcN7Us/EWZjqWNFkZ7jJhUDwXNRtjCpqhIQJBAOF1sMqZKAVdE8ugYTw8XgPWcO/CFd/UKNP/IReC7/i36zDIwnFinPEa5vmvPk5ff3B4K482N7vS0ztGQeTUGhkCQQDUuHd0EmuQYI5VYbpeEIBJ8uTnEJ/9Jik3FqAxJpo5+vRuxYb6Ul57rMMP0vlTwm92NXhRwVVmQLML81kqzwSdAkBKlVRWsTO8En5p7jQ8aPvw6Q+TQPFbiiO3fb7EuFwKO01iZgds2uJwICYokwBZjN3rptVCGv109NlL0oIZ4NCBAkAhU/WDPg+UQ0yJnBIzAqrW6zNp8HTgmMYEV4spqD6pruP1JwWK2rTq85psNEXUFbaY8q+zP3M93g0vZiUmS+ERAkEA0lBhEJcJWhc9WPoWLqA5HKxUoKkJzgC2ljeTxtz6oY/YdLErq4FUcM3RIGG6kYqMIjrZfww+jqjJ4v8lIZgh4A==";//RSACoder.getPrivateKey(keyMap); + String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMSmBCx1ghaVLT/x96ERi9lo3XY/dzKFc9y5f7RtPJihU6fijX4eFSNrhJAjnP2pkJfCXLEmaPznmoUfrUhmq3yeXNzRNILQ+XAUcGkX13oMqW9qM/u5ZHlBnBwMiCZVOZ4pmaZ+hgA8jiNjhh1AqBkRpbvlfnlyC0fBv5FcXOQ3AgMBAAECgYBhfp2bHTc90v/4MBLBfF2FkIQb2CNUnO1whVdXMMFWOsWq+puD5447XVb/z2hKKwNQ+j/SZGSw3nKxhZ73wk9KPkGo9o4gjdwbgo6Qnk8sGQFpCg+5aFH1CgMy5PaM2ZcxbPOfO7tardS1D9u3Vm88688Qdk5sLLWkf6JuNP6LIQJBAPQ4w4qMOfI7Uss90A7/SGHWUjzLvsEv5eq/jXpRhJnyX5tHDCgPCq4CQKwBfUbzdapMtsf065aZCWZR51+V3g0CQQDOIeYX3TTDadzg/cC8tG/AVnxbsoY2Cy9fXmzJCfXIOxZPQIL1WF7HDveTXRxhp6CjSkzVcFJ9K1MFbl/WCf5TAkBqqawFg87/E5fKelm3Yxlq2Z8bPGU4nMHO8BBLXvUKA4hsGfCeQkuIyiUSuqfLaCN42H5wAHEwWfB4BseFwL+1AkBgqfrp4/0TSnifNcAFfiQNsUD+C1juzQ35DiG7oSUWMcdDgQAop7lCZd1pyLc/gElPac9gJB06v29eU6UzjVorAkEAymdUmrgcezAi+aMA0+QcenvPiom3jQkduvfBjOiSLSWm5oB8+mMlExl8Vm9FtKMms6zOs/LcTZzxonl//oe4Ag=="; + // 私钥解密 "abcd#123456" + String s1 = "pa+6STSQ5ZK94/xMzLE4VCFnbYgan1oUADGv0N07fu1QXfzuVoLLDPyPbduFQwxVB1ZFbkrJIhB56ZtkdqN0A12bNQ13MylyfJfL3NJTUJYukINmAOB8WgB8t9ZIyH2EZRK6YbtGgy2MS6YsisJ93G4ofrEHkv4r3nnl++9ZUzE="; +// String userInfo = "Hwlfh/41CulvHFgenFTv%2BUiyN2CaXz9s0ypdy9yN1TkrtNARpfkpgjDJF7ZETfdmNDNRedkdOeNThZB0Ma23UQ5RHD4dr6DWV9LhZisxpY1nm3IN49F/Pz9Z0CUh//ttXT0f35B86UXwNni0ITLgfH0kMCA9aoShmtU0eg01EqB9CthbVeCKjVudYnR4VG%2B%2Bb%2BStYNnFpa0pcyPvf8F5GtPPuQGQYn9SbfL52i8gEFPi3oshVxlQBzi9yy/r%2BL%2B8LtiBp1ojeGe6n1D0HB8/RRqPWn7PxXKHvqCiwmHTkDClJlXNdWxzkZPzZSMi5nrL9QEZSGQ91oSHzlI/suUKWg=="; +// byte[] b1 = decrypt(privateKey, URLDecoder.decode(userInfo, StandardCharsets.UTF_8) ); + String userInfo = "iu6HWB0lqozQ5UQxvtZDy2CdlMSOaJ4fXHduRLtQpnzj/m5pAbaOyWZ0rUe+sqIc887XgdTjNODEeFtM6adgBmS6DZmzAYIt+6I/o5Me7HUVl/EpMwO1PlT98lz/mzOXdPHGZTv/6DLXEDxR3fr17agP6oXq/YbrPsClJ1e5K/qpxNxCqgEv03Kl7gM27ZHBs0PCkUyzv8Wj3yES28tTYpJyKKK4LZvEt1S7c+g9WT+GgjO9tLEh4lUxyVKmBEAJfKcrCQzcu8e3E8yRjNdtqyk3/XTF/kagoSTHFqt3EHxdQBXM8XM2xzkZNcdohaWD7JuaiWXHsuLCtYVO5dYY+Q=="; + JSONObject json = null; + if (needsUrlDecode(userInfo)){ + byte[] b1 = RSAUtil.decrypt(privateKey, URLDecoder.decode(userInfo, StandardCharsets.UTF_8)); + json = JSONObject.parseObject(new String(b1)); + }else { + byte[] b1 = RSAUtil.decrypt(privateKey, userInfo); + json = JSONObject.parseObject(new String(b1)); + } + byte[] b1 = decrypt(privateKey, userInfo); + System.out.println(new String(b1)); +// JSONObject json = JSONObject.parseObject(new String(b1)); + + // 私钥加密 "abcd#123456" + String s2 = "abcd#123456"; + byte[] b2 = encryptByPrivateKey(s2.getBytes(),privateKey); + // 转base64字符串后作为参数发送 + String s = encryptBASE64(b2); +// System.out.println(s); + } +} diff --git a/stwzhj-common/stwzhj-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/stwzhj-common/stwzhj-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index d621dad0..49edf231 100644 --- a/stwzhj-common/stwzhj-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/stwzhj-common/stwzhj-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -33,13 +33,11 @@ public class BaseEntity implements Serializable { /** * 创建部门 */ - @TableField(fill = FieldFill.INSERT) private String createDept; /** * 创建者 */ - @TableField(fill = FieldFill.INSERT) private Long createBy; /** @@ -51,7 +49,6 @@ public class BaseEntity implements Serializable { /** * 更新者 */ - @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateBy; /** diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/SysUser.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/SysUser.java index 4028aa2f..6a0a58a7 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/SysUser.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -106,6 +106,9 @@ public class SysUser extends TenantEntity { private String manageDeptId; + private String idCard; + + public SysUser(Long userId) { this.userId = userId; } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index ea591729..1fda726e 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -87,6 +87,8 @@ public class SysUserBo extends BaseEntity { */ private String remark; + private String idCard; + /** * 角色组 */ diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index 4f6eb2e5..1cdd286f 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -114,6 +114,8 @@ public class SysUserVo implements Serializable { private Date createTime; private String manageDeptId; + + private String idCard; /** * 部门名 */ diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java index 00524fe4..301f9435 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -140,6 +140,29 @@ public class RemoteUserServiceImpl implements RemoteUserService { }); } + /** + * 通过身份证查询用户信息 + * + * @param idCard 身份证 + * @param tenantId 租户id + * @return 结果 + */ + @Override + public LoginUser getUserInfoByIdCard(String idCard, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getIdCard, idCard)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", idCard); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", idCard); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(sysUser); + }); + } + /** * 通过openid查询用户信息 * diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 22536be8..527563c2 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -47,6 +47,6 @@ public interface SysDeptMapper extends BaseMapperPlus { List deviceStaticsByDeptId(@Param("deviceType")String deviceType, @Param("deptId")String deptId); - List jzDept(String updateTime); + List jzDept(String updateTime); } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index fc7fc6e1..be2fe13f 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -88,4 +88,12 @@ public interface SysUserMapper extends BaseMapperPlus { }) int updateById(@Param(Constants.ENTITY) SysUser user); + List jzUser(String updateTime); + + Page jzUserPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + int insertUser(SysUser user); + + int updateUser(SysUser user); + } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzDeptSchedule.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzDeptSchedule.java index f5086c87..0d21a9ec 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzDeptSchedule.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzDeptSchedule.java @@ -1,5 +1,6 @@ package org.dromara.system.schedule; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.http.HttpUtil; @@ -8,6 +9,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.service.ISysDeptService; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; @@ -84,4 +86,41 @@ public class JzDeptSchedule { } + @RequestMapping("/insertJzDeptAll") + public void insertJzDeptAll(){ + List list = deptService.jzDpet(""); + List sysList = new ArrayList<>(); + for (SysDeptVo dept : list) { + if (!"1".equals(dept.getStatus())){ + continue; //删除的不入库 + } + dept.setStatus("0"); + dept.setShortName(dept.getDeptName()); + sysList.add(dept); + } + deptService.insertBatch(BeanUtil.copyToList(sysList, SysDept.class)); + } + + + + + @Scheduled(cron = "0 0 0/1 * * ?") + public void jzDeptNew(){ + Date time = DateUtil.offsetHour(new Date(),-1); + List list = deptService.jzDpet(DateUtil.formatDateTime(time)); + List sysList = new ArrayList<>(); + for (SysDeptVo dept : list) { + if ("1".equals(dept.getStatus())){ + dept.setStatus("0"); + }else { + dept.setStatus("1"); + } + dept.setShortName(dept.getDeptName()); + sysList.add(dept); + } + deptService.insertORUpdate(BeanUtil.copyToList(sysList, SysDept.class)); + } + + + } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzUserSchedule.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzUserSchedule.java new file mode 100644 index 00000000..a98b1c20 --- /dev/null +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/schedule/JzUserSchedule.java @@ -0,0 +1,62 @@ +package org.dromara.system.schedule; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.domain.SysUser; +import org.dromara.system.service.ISysUserService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RequiredArgsConstructor +@RestController +public class JzUserSchedule { + + private final ISysUserService userService; + + @RequestMapping("/insertJzUserAll") + public void insertJzUserAll(int pageNum,int pageSize){ + PageQuery query = new PageQuery(); + query.setPageNum(pageNum); + query.setPageSize(pageSize); + Page page = userService.jzUserPage(query); + List jzlist = page.getRecords(); + List syslist = new ArrayList<>(); + for (SysUser user: jzlist) { + if (user.getStatus().equals("-99")){ + continue; + } + user.setStatus("0"); + user.setPassword(BCrypt.hashpw("123456")); + user.setManageDeptId(user.getDeptId()); + syslist.add(user); + } + userService.insertBatch(syslist); + } + +// @Scheduled(cron = "0 0 0/1 * * ?") + public void jzUser(){ + Date time = DateUtil.offsetHour(new Date(),-1); + List jzlist = userService.jzUser(DateUtil.formatDateTime(time)); + List syslist = new ArrayList<>(); + for (SysUser user: jzlist) { + if (user.getStatus().equals("-99")){ + user.setStatus("1"); + }else { + user.setStatus("0"); + } + user.setPassword(BCrypt.hashpw("123456")); + user.setManageDeptId(user.getDeptId()); + syslist.add(user); + } + userService.insertORUpdate(syslist); + } + +} diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysDeptService.java index 50e0ebaa..2f051934 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -140,7 +140,9 @@ public interface ISysDeptService { List deviceStatics(String deviceType,String manageDeptId); - List jzDpet(String updateTime); + List jzDpet(String updateTime); + + boolean insertBatch(List list); boolean insertORUpdate(List list); } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysUserService.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysUserService.java index 882cf35c..4f8e41e3 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -1,7 +1,9 @@ package org.dromara.system.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; @@ -268,4 +270,15 @@ public interface ISysUserService { */ List selectUserIdsByRoleIds(List roleIds); + /* + * 警综用户 + * */ + List jzUser(String updateTime); + + Page jzUserPage(PageQuery pageQuery); + + boolean insertBatch(List list); + + boolean insertORUpdate(List list); + } diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index eb850594..d6469080 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -390,10 +390,16 @@ public class SysDeptServiceImpl implements ISysDeptService { @Override @DS("slave") - public List jzDpet(String updateTime) { + public List jzDpet(String updateTime) { return baseMapper.jzDept(updateTime); } + @Override + public boolean insertBatch(List list) { + return baseMapper.insertBatch(list,500); + } + + @Override public boolean insertORUpdate(List list) { List batchResults = baseMapper.insertOrUpdate(list); diff --git a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 82227e78..dd03ac8a 100644 --- a/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/stwzhj-modules/wzhj-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -626,4 +627,46 @@ public class SysUserServiceImpl implements ISysUserService { return ObjectUtil.isNull(sysUser) ? null : sysUser.getEmail(); } + @Override + @DS("slave") + public List jzUser(String updateTime) { + return baseMapper.jzUser(updateTime); + } + + @Override + @DS("slave") + public Page jzUserPage(PageQuery pageQuery) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getUserType,"SYS"); + lqw.orderByAsc(SysUser::getUserId); + Page userPage = baseMapper.jzUserPage(pageQuery.build(),lqw); + return userPage; + } + + + @Override + public boolean insertBatch(List list) { + + return baseMapper.insertBatch(list,1000); + } + + @Override + public boolean insertORUpdate(List list) { + for (SysUser user : list) { + SysUser u = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUserName,user.getUserName()).last("limit 1")); + if (null != u){ + user.setUserId(u.getUserId()); + baseMapper.updateUser(user); + }else { + baseMapper.insertUser(user); + SysUserRole userRole = new SysUserRole(); + userRole.setRoleId(4l); + userRole.setUserId(user.getUserId()); + userRoleMapper.insert(userRole); + } + } + return true; + } + + } diff --git a/stwzhj-modules/wzhj-system/src/main/resources/mapper/system/SysUserMapper.xml b/stwzhj-modules/wzhj-system/src/main/resources/mapper/system/SysUserMapper.xml index 332fc58b..8cc2a053 100644 --- a/stwzhj-modules/wzhj-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/stwzhj-modules/wzhj-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -69,5 +69,68 @@ select count(*) from sys_user where del_flag = '0' and user_id = #{userId} + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + user_type, + email, + phonenumber, + sex, + password, + status, + manage_dept_id, + id_card, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{userType}, + #{email}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{manageDeptId}, + #{idCard}, + #{createTime} + ) + + + + update sys_user + + dept_id = #{deptId}, + user_name = #{userName}, + id_card = #{idCard}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + password = #{password}, + status = #{status}, + manage_dept_id = #{manageDeptId}, + update_time = #{updateTime} + + where user_id = #{userId} + +