From 4494a005613728c9dc22d018bca42ef5d3ebcf69 Mon Sep 17 00:00:00 2001 From: xiejun <xiejun@vci-tech.com> Date: 星期二, 14 一月 2025 20:41:47 +0800 Subject: [PATCH] 产品型号集成,类型转换,人员组织加日志,申请接口引用码段值校验 --- Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java | 279 ++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 201 insertions(+), 78 deletions(-) diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java index 9385ed8..a4d79c9 100644 --- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java @@ -1,14 +1,23 @@ package com.vci.ubcs.code.service.impl; import com.alibaba.fastjson.JSON; -import com.vci.ubcs.code.config.HeaderMapRequestWrapper; import com.vci.ubcs.code.entity.TokenUserObject; import com.vci.ubcs.code.service.IPasswordFreeLoginService; -import com.vci.ubcs.code.util.HttpUtils; -import org.springblade.core.cache.utils.CacheUtil; +import com.vci.ubcs.starter.util.HttpUtils; +import com.vci.ubcs.system.cache.NacosConfigCache; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.auth.AuthenticationException; +import org.springblade.core.jwt.JwtUtil; +import org.springblade.core.jwt.props.JwtProperties; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; @@ -19,11 +28,15 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import javax.annotation.Resource; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import static com.vci.ubcs.starter.util.AESUtils.aesDecrypt; +import static com.vci.ubcs.starter.util.AESUtils.aesEncrypt; +import static org.springblade.core.secure.utils.AuthUtil.parseJWT; /** * 鍏嶅瘑鐧诲綍鏈嶅姟 @@ -31,118 +44,228 @@ * @date 2023/9/11 15:45 */ @Service +@Slf4j public class PasswordFreeLoginServiceImpl implements IPasswordFreeLoginService { // 閫氳繃鏈嶅姟娉ㄥ唽涓績鑾峰彇缃戝叧鐨勭鍙e彿 @Autowired private DiscoveryClient discoveryClient; - @Value("${user-info.pwd-free-tenant-id}") + + // 閰嶇疆鐨勫厤瀵嗙櫥褰曠殑璐﹀彿鎵�灞炵殑绉熸埛id + @Value("${password-free.pwd-free-tenant-id:000000}") private String pwdFreeTenantId; + + // 閰嶇疆鐨則oken鍦╮edis涓殑鐢熷瓨鏃堕棿 + @Value("${password-free.token-redis-expire:36000}") + private Long tokenRedisExpire; + + @Value("${password-free.pwd-free-addr:localhost}") + private String pwdFreeAddr; + + @Value("${password-free.client-id:a104c4fd2f0e4958}") + private String clientId;//搴旂敤ID + + @Value("${password-free.secret-key:9fbd170bd83eb869}") + private String secretKey;//搴旂敤绉橀挜 + @Autowired private BladeRedis bladeRedis; + // 缂撳瓨鍚� public static final String PWD_FREE_LOGIN_TOKEN = "pwdFreeLogin:Token:"; + private static JwtProperties jwtProperties; /** - * 鑾峰彇缃戝叧绔彛 + * 鏍规嵁鏈嶅姟鍚嶈幏鍙栫鍙e彿 + * @param serviceId * @return */ - private String getGatewayPort() { - List<ServiceInstance> instances = discoveryClient.getInstances("ubcs-gateway"); + public String getGatewayPort(String serviceId) { + List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); if (!instances.isEmpty()) { ServiceInstance gatewayInstance = instances.get(0); return String.valueOf(gatewayInstance.getPort()); } - return "80"; - } - - /** - * 鍏嶅瘑鐧诲綍骞跺瓨鍏ョ紦瀛橈紝閰嶅悎杩囨护鍣ㄥ啓娉� - * @param username 璐﹀彿 - * @return - */ - @Override - public String passwordFreeLogin(String username, ServletRequest servletRequest) { - // 鍏嶅瘑鐧诲綍鎺ュ彛鍦板潃 - String loginUrl = "http://localhost:"+this.getGatewayPort()+"/ubcs-auth/oauth/token"; - // 璇锋眰鏉ヨ嚜宸卞摢涓猧p鍦板潃 - HttpServletRequest request = (HeaderMapRequestWrapper) servletRequest; - String ipAddr = request.getRemoteAddr(); - // 鍏堝皾璇曚粠缂撳瓨褰撲腑鍙栵紝濡傛灉涓嶅瓨鍦ㄥ氨鐧诲綍 - String redisToken = (String)bladeRedis.get(PWD_FREE_LOGIN_TOKEN+ipAddr); - if(Func.isNotBlank(redisToken)){ - // 缂撳瓨涓凡缁忓瓨鍦ㄥ氨鐩存帴鍒犻櫎璇ョ紦瀛橈紝涓昏涓轰簡閬垮厤缁熶竴ip涓嬪瓨鍦ㄥ涓猼oken鐨勬儏鍐� - bladeRedis.del(PWD_FREE_LOGIN_TOKEN+ipAddr); - } - // 涓嶅瓨鍦ㄥ氨閲嶆柊鑾峰彇token - // 璁剧疆璇锋眰澶� - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - headers.set("Authorization", "Basic c3dvcmQ6c3dvcmRfc2VjcmV0"); - headers.set("Tenant-Id", pwdFreeTenantId); - - //璁剧疆璇锋眰浣撳弬鏁� - MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>(); - parameters.add("username",username); - parameters.add("grant_type", "passwordfree"); - parameters.add("scope", "all"); - parameters.add("type", "account"); - - // 鍙戦�丳OST璇锋眰 - String responseBody = HttpUtils.post(loginUrl, parameters,headers); - //鎷垮埌鍝嶅簲浣撳叾涓寘鍚玹oken,鐢╮equest涓殑ip鍦板潃浣滀负閿�硷紝灏唗oken瀛樺叆缂撳瓨 - TokenUserObject tokenUserObject = null; - try { - tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); - }catch (Exception e){ - throw new ServiceException("responseBody杞崲TokenUserObject澶辫触:"+e.getMessage()); - } - // 灏唗oken瀛樺叆缂撳瓨褰撲腑,杩囨湡鏃堕棿涓�24灏忔椂 - bladeRedis.setEx(PWD_FREE_LOGIN_TOKEN+ipAddr,"bearer "+tokenUserObject.getAccess_token(),60*60*60*24L); - return responseBody; + return "8080"; } /** * 鍏嶅瘑鐧诲綍锛屾敼鍙樺綋鍓峸ebservice璇锋眰鐨刪eader - * @param username 璐﹀彿 - * @return + * @param userName 璐﹀彿 + * @param servletRequest + * @return boolean + * @throws AuthenticationException */ @Override - public boolean passwordFreeLogin2(String username, HttpServletRequest servletRequest) { - // 鍏嶅瘑鐧诲綍鎺ュ彛鍦板潃 - String loginUrl = "http://localhost:"+this.getGatewayPort()+"/ubcs-auth/oauth/token"; + public boolean pwdFreeLoginByBoolean(String userName, ServletRequest servletRequest) throws AuthenticationException { + //杩涙潵鍏堝垽鏂紦瀛樹腑鏄惁瀛樺湪token + // 璇锋眰鏉ヨ嚜宸卞摢涓猧p鍦板潃 + HttpServletRequest request = (HttpServletRequest) servletRequest; + String ipAddr = request.getRemoteAddr(); + // 鍏堝皾璇曚粠缂撳瓨褰撲腑鍙栵紝瀛樺湪灏辩洿鎺ヤ粠缂撳瓨涓幏鍙� + String authToken = bladeRedis.get(PWD_FREE_LOGIN_TOKEN+ipAddr+":"+userName); + // 瑙f瀽token瀛樻斁杩沘ttr涓� + String token2 = JwtUtil.getToken(authToken); + BladeUser user = this.getUser(token2); + //涓嶅瓨鍦ㄥ氨璇锋眰 + if(Func.isEmpty(authToken) || Func.isEmpty(user) || !user.getTenantId().equals(NacosConfigCache.getAdminUserInfo().getTenantId())){ + String responseBody = this.passwordFreeLogin(userName); + //鎷垮埌鍝嶅簲浣撳叾涓寘鍚玹oken,鐢╮equest涓殑ip鍦板潃浣滀负閿�硷紝灏唗oken瀛樺叆缂撳瓨 + TokenUserObject tokenUserObject = null; + try { + tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); + }catch (Exception e){ + throw new ServiceException("閴存潈鍝嶅簲鍐呭杞崲涓篢okenUserObject澶辫触:"+e.getMessage()); + } + // 鎷兼帴token鏍煎紡 + authToken = "bearer " + tokenUserObject.getAccess_token(); + // 灏唗oken瀛樺叆缂撳瓨褰撲腑,杩囨湡鏃堕棿涓�24灏忔椂 + bladeRedis.setEx(PWD_FREE_LOGIN_TOKEN+ipAddr+":"+userName,"bearer "+tokenUserObject.getAccess_token(),tokenRedisExpire); + token2 = JwtUtil.getToken(authToken); + user = this.getUser(token2); + } + request.setAttribute("Blade-Auth",authToken); + request.setAttribute("_BLADE_USER_REQUEST_ATTR_",user); + request.setAttribute("Authorization",authToken); + return true; + } - // 鑾峰彇token锛屽厛璁剧疆璇锋眰澶� + /** + * 鍏嶅瘑鐧诲綍璇锋眰鍙戦�� + * @param userName 璐﹀彿 + * @return 杩斿洖token + * @throws AuthenticationException + */ + @Override + public String passwordFreeLogin(String userName) throws AuthenticationException { + // 鍏嶅瘑鐧诲綍鎺ュ彛鍦板潃 + String loginUrl = "http://"+pwdFreeAddr+":"+this.getGatewayPort("ubcs-gateway")+"/ubcs-auth/oauth/token"; + log.debug("褰撳墠鍏嶅瘑鐧诲綍璋冪敤鍦板潃锛�"+loginUrl); + // 璇锋眰ubcs-auth鏈嶅姟鑾峰彇token锛屽厛璁剧疆璇锋眰澶� HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); headers.set("Authorization", "Basic c3dvcmQ6c3dvcmRfc2VjcmV0"); headers.set("Tenant-Id", pwdFreeTenantId); //璁剧疆璇锋眰浣撳弬鏁� MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>(); - parameters.add("username",username); + parameters.add("username",userName); parameters.add("grant_type", "passwordfree"); parameters.add("scope", "all"); parameters.add("type", "account"); - // 鍙戦�丳OST璇锋眰 - String responseBody = HttpUtils.post(loginUrl, parameters,headers); - //鎷垮埌鍝嶅簲浣撳叾涓寘鍚玹oken,鐢╮equest涓殑ip鍦板潃浣滀负閿�硷紝灏唗oken瀛樺叆缂撳瓨 - TokenUserObject tokenUserObject = null; + String responseBody = null; try { - tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); + // 鍙戦�丳OST璇锋眰 + responseBody = HttpUtils.post(loginUrl, parameters,headers); }catch (Exception e){ - throw new ServiceException("responseBody杞崲TokenUserObject澶辫触:"+e.getMessage()); + throw new AuthenticationException("璋冪敤閴存潈鏈嶅姟ubcs-auth澶辫触锛屽師鍥狅細"+e.getMessage()); } - HttpServletRequest request = (HeaderMapRequestWrapper) servletRequest; - HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request); + return responseBody; + } - //璁剧疆褰撳墠web鎺ュ彛鐨勮姹傚ご - String token = "bearer " + tokenUserObject.getAccess_token(); - // 灏唗oken璁剧疆鍒癶eader涓� - requestWrapper.setHeader("Blade-Auth", token); - requestWrapper.setHeader("Authorization","Basic c3dvcmQ6c3dvcmRfc2VjcmV0"); + /** + * 鍗曠偣鐧诲綍 + * @param empCode + * @return + * @throws Exception + */ + @Override + public String ssoFreeLogin(String empCode) throws Exception { + if(Func.isBlank(empCode)){ + throw new ServiceException("鏈幏鍙栧埌empCode鍙傛暟"); + } + String enStr2; + try { + String enStr1 = aesDecrypt(empCode, secretKey); + enStr2 = aesDecrypt(enStr1, clientId); + }catch (Exception e){ + throw new ServiceException("empCode鍙傛暟瑙e瘑澶辫触锛佸師鍥�:"+e.getMessage()); + } + // 瑙e瘑 + log.debug("鍗曠偣鐧诲綍鍙傛暟瑙e瘑鍚庯細"+enStr2); + String token = this.passwordFreeLogin(enStr2); + return token; + } - // 灏唗oken瀛樺叆缂撳瓨褰撲腑,杩囨湡鏃堕棿涓�24灏忔椂 - return true; + /** + * 鏍规嵁token鑾峰彇鐢ㄦ埛淇℃伅 + * @param token + * @return + */ + private static BladeUser getUser(String token) { + Claims claims = getClaims(token); + if (claims == null) { + return null; + } else { + String clientId = Func.toStr(claims.get("client_id")); + Long userId = Func.toLong(claims.get("user_id")); + String tenantId = Func.toStr(claims.get("tenant_id")); + String oauthId = Func.toStr(claims.get("oauth_id")); + String deptId = Func.toStrWithEmpty(claims.get("dept_id"), "-1"); + String postId = Func.toStrWithEmpty(claims.get("post_id"), "-1"); + String roleId = Func.toStrWithEmpty(claims.get("role_id"), "-1"); + String account = Func.toStr(claims.get("account")); + String roleName = Func.toStr(claims.get("role_name")); + String userName = Func.toStr(claims.get("user_name")); + String nickName = Func.toStr(claims.get("nick_name")); + String tenantName = Func.toStr(claims.get("tenantName")); + String email = Func.toStr(claims.get("email")); + String deptName = Func.toStr(claims.get("deptName")); + String secretGrade = Func.toStr(claims.get("secretGrade")); + Kv detail = Kv.create().setAll((Map)claims.get("detail")); + BladeUser bladeUser = new BladeUser(); + bladeUser.setClientId(clientId); + bladeUser.setUserId(userId); + bladeUser.setTenantId(tenantId); + bladeUser.setOauthId(oauthId); + bladeUser.setAccount(account); + bladeUser.setDeptId(deptId); + bladeUser.setPostId(postId); + bladeUser.setRoleId(roleId); + bladeUser.setRoleName(roleName); + bladeUser.setUserName(userName); + bladeUser.setNickName(nickName); + detail.put("tenantName", tenantName); + detail.put("deptName", deptName); + detail.put("email", email); + detail.put("secretGrade", secretGrade); + bladeUser.setDetail(detail); + return bladeUser; + } + } + + /** + * 瑙f瀽token + * @param authToken + * @return + */ + private static Claims getClaims(String authToken) { + Claims claims = null; + String token = null; + String tenantId; + if (StringUtil.isNotBlank(authToken)) { + token = JwtUtil.getToken(authToken); + } + if (StringUtil.isNotBlank(token)) { + claims = parseJWT(token); + } + if (ObjectUtil.isNotEmpty(claims) && getJwtProperties().getState()) { + tenantId = Func.toStr(claims.get("tenant_id")); + String userId = Func.toStr(claims.get("user_id")); + String accessToken = JwtUtil.getAccessToken(tenantId, userId, token); + if (!token.equalsIgnoreCase(accessToken)) { + return null; + } + } + + return claims; + } + + private static JwtProperties getJwtProperties() { + if (jwtProperties == null) { + jwtProperties = (JwtProperties) SpringUtil.getBean(JwtProperties.class); + } + + return jwtProperties; } } -- Gitblit v1.9.3