正在显示
3 个修改的文件
包含
174 行增加
和
6 行删除
| @@ -11,6 +11,7 @@ import com.tianbo.warehouse.controller.response.ResultJson; | @@ -11,6 +11,7 @@ import com.tianbo.warehouse.controller.response.ResultJson; | ||
| 11 | import com.tianbo.warehouse.dao.UserRoleMapper; | 11 | import com.tianbo.warehouse.dao.UserRoleMapper; |
| 12 | import com.tianbo.warehouse.model.*; | 12 | import com.tianbo.warehouse.model.*; |
| 13 | import com.tianbo.warehouse.security.filter.JwtTokenUtil; | 13 | import com.tianbo.warehouse.security.filter.JwtTokenUtil; |
| 14 | +import com.tianbo.warehouse.security.login.TokenUtils; | ||
| 14 | import com.tianbo.warehouse.service.PermissionService; | 15 | import com.tianbo.warehouse.service.PermissionService; |
| 15 | import com.tianbo.warehouse.service.RoleService; | 16 | import com.tianbo.warehouse.service.RoleService; |
| 16 | 17 | ||
| @@ -266,8 +267,77 @@ public class AnonymousController { | @@ -266,8 +267,77 @@ public class AnonymousController { | ||
| 266 | */ | 267 | */ |
| 267 | @PostMapping(value = "/userSynchronization") | 268 | @PostMapping(value = "/userSynchronization") |
| 268 | @ResponseBody | 269 | @ResponseBody |
| 269 | - public ResultMessage userSynchronization(@RequestBody Map<String, Object> map){ | 270 | + public ResultMessage userSynchronization(@RequestBody Map<String, Object> map, @RequestHeader Map<String, String> headers,HttpServletRequest request){ |
| 270 | log.info("[SSO-资源同步]-参数打印:\n{}",map.toString()); | 271 | log.info("[SSO-资源同步]-参数打印:\n{}",map.toString()); |
| 272 | + headers.forEach((key,value)->{ | ||
| 273 | + log.info("[SSO-USER-SYNCHRONIZATION-HEADER-INFO]-key:{},value:{}",key,value); | ||
| 274 | + }); | ||
| 275 | + | ||
| 276 | + //IP白名单 | ||
| 277 | + List<String> ipWhiteList = Arrays.asList( | ||
| 278 | + "10.5.14.108", | ||
| 279 | + "10.5.14.109", | ||
| 280 | + "10.5.14.110", | ||
| 281 | + "127.0.0.1" | ||
| 282 | + ); | ||
| 283 | + | ||
| 284 | + String requestRemoteAddr = request.getHeader("X-Forwarded-For"); | ||
| 285 | + | ||
| 286 | + if (StringUtils.isEmpty(requestRemoteAddr)){ | ||
| 287 | + requestRemoteAddr = request.getRemoteAddr(); | ||
| 288 | + }else { | ||
| 289 | + requestRemoteAddr = requestRemoteAddr.split(",")[0]; | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + if (ipWhiteList.contains(requestRemoteAddr)){ | ||
| 293 | + log.info("[SSO-USER-SYNCHRONIZATION-IPWhiteList]-ipWhiteList:[{}]",requestRemoteAddr); | ||
| 294 | + }else { | ||
| 295 | + log.info("[SSO-USER-SYNCHRONIZATION-IPWhiteList]-ip:[{}]白名单验证失败,访问IP不在白名单内",requestRemoteAddr); | ||
| 296 | + return new ResultMessage(400,"访问IP不在白名单内,验证失败.ip:"+requestRemoteAddr); | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + // 用headers Map 取值 key 键值时 key会全部转为小写 在springboot 中 | ||
| 300 | + if (headers.containsKey("once") && headers.containsKey("ts") && headers.containsKey("appkey") && headers.containsKey("signmethod") && headers.containsKey("signdata")){ | ||
| 301 | + String appAuthKey = "4768711539138560" ; | ||
| 302 | + if (appAuthKey.equals(headers.get("appkey"))){ | ||
| 303 | + String bodyData = JSON.toJSONString(map); | ||
| 304 | + String appPwd = "ce10ec6cc310966de5264994817a0f7c1b2b9e3b"; | ||
| 305 | + log.info("[SSO-INFO]-apppwd:{}",appPwd); | ||
| 306 | + StringBuilder sb = new StringBuilder(); | ||
| 307 | + //签名验证格式拼接 | ||
| 308 | + | ||
| 309 | + sb.append("appKey=").append(headers.get("appkey")) | ||
| 310 | + .append("&ts=").append(headers.get("ts")) | ||
| 311 | + .append("&once=").append(headers.get("once")) | ||
| 312 | + .append("&signMethod=").append(headers.get("signmethod")) | ||
| 313 | + .append("&bodyData=").append(bodyData); | ||
| 314 | + String signAuthURI = sb.toString(); | ||
| 315 | + // 签名生成 | ||
| 316 | + try{ | ||
| 317 | + String signData = TokenUtils.getSignature(appPwd, signAuthURI); | ||
| 318 | + // 签名验证 | ||
| 319 | + if (signData.equals(headers.get("signdata"))){ | ||
| 320 | + log.info("[SSO-USER-SYNCHRONIZATION-HEADER-SUCCESS]-头部签名验证成功"); | ||
| 321 | + }else { | ||
| 322 | + log.error("[SSO-USER-SYNCHRONIZATION-HEADER-AUTHFAIL]-头部签名验证失败"); | ||
| 323 | +// return new ResultMessage(400,"app签名验证失败"); | ||
| 324 | + } | ||
| 325 | + }catch (Exception e){ | ||
| 326 | + log.error("[SSO-USER-SYNCHRONIZATION-HEADER-AUTH-ERR]-",e); | ||
| 327 | +// return new ResultMessage(400,"app签名验证出错"+e.getMessage()); | ||
| 328 | + } | ||
| 329 | + | ||
| 330 | + }else { | ||
| 331 | + log.error("[SSO-USER-SYNCHRONIZATION-HEADER-FAILD],key:{},不为验证key:4768711539138560",headers.get("appKey")); | ||
| 332 | +// return new ResultMessage(400,"appKey验证失败"); | ||
| 333 | + } | ||
| 334 | + }else { | ||
| 335 | + log.error("[SSO-USER-SYNCHRONIZATION-HEADER-FAILD]-缺少必要头部验证信息"); | ||
| 336 | +// return new ResultMessage(400,"缺少必要头部验证信息,app验证失败"); | ||
| 337 | + } | ||
| 338 | + | ||
| 339 | + | ||
| 340 | + | ||
| 271 | //获取action的值,判断是push数据还是删除数据 | 341 | //获取action的值,判断是push数据还是删除数据 |
| 272 | String action = map.get("action").toString(); | 342 | String action = map.get("action").toString(); |
| 273 | if ("user".equals(map.get("resType").toString())){ | 343 | if ("user".equals(map.get("resType").toString())){ |
| @@ -14,13 +14,15 @@ public class SSOUserData { | @@ -14,13 +14,15 @@ public class SSOUserData { | ||
| 14 | 14 | ||
| 15 | private String USER_NO; | 15 | private String USER_NO; |
| 16 | 16 | ||
| 17 | + private Integer USER_TYPE; | ||
| 18 | + | ||
| 17 | private String MOBILE; | 19 | private String MOBILE; |
| 18 | 20 | ||
| 19 | private String IDCARD_NO; | 21 | private String IDCARD_NO; |
| 20 | 22 | ||
| 21 | private String COUNTRY; | 23 | private String COUNTRY; |
| 22 | 24 | ||
| 23 | - private String SEX; | 25 | + private Integer SEX; |
| 24 | 26 | ||
| 25 | private String NATIONALITY; | 27 | private String NATIONALITY; |
| 26 | 28 | ||
| @@ -34,9 +36,11 @@ public class SSOUserData { | @@ -34,9 +36,11 @@ public class SSOUserData { | ||
| 34 | 36 | ||
| 35 | private String JOB_TITLE; | 37 | private String JOB_TITLE; |
| 36 | 38 | ||
| 37 | - private String JOB_TYPE; | 39 | + private Integer JOB_TYPE; |
| 40 | + | ||
| 41 | + private Integer JOB_STATUS; | ||
| 38 | 42 | ||
| 39 | - private String JOB_STATUS; | 43 | + private Integer USER_JOB_STATUS; |
| 40 | 44 | ||
| 41 | private String JOB_POSITION; | 45 | private String JOB_POSITION; |
| 42 | 46 | ||
| @@ -52,7 +56,7 @@ public class SSOUserData { | @@ -52,7 +56,7 @@ public class SSOUserData { | ||
| 52 | 56 | ||
| 53 | private String LOGIN_NAME; | 57 | private String LOGIN_NAME; |
| 54 | 58 | ||
| 55 | - private String SHOW_ORDER; | 59 | + private Integer SHOW_ORDER; |
| 56 | 60 | ||
| 57 | private String REMARK; | 61 | private String REMARK; |
| 58 | 62 | ||
| @@ -64,5 +68,5 @@ public class SSOUserData { | @@ -64,5 +68,5 @@ public class SSOUserData { | ||
| 64 | 68 | ||
| 65 | private String PWD_ENCRYPT; | 69 | private String PWD_ENCRYPT; |
| 66 | 70 | ||
| 67 | - private String UPDATE_TIME; | 71 | + private Long UPDATE_TIME; |
| 68 | } | 72 | } |
| 1 | +package com.tianbo.warehouse.security.login; | ||
| 2 | + | ||
| 3 | +import lombok.extern.slf4j.Slf4j; | ||
| 4 | +import org.apache.commons.lang3.StringUtils; | ||
| 5 | +import org.apache.commons.lang3.ArrayUtils; | ||
| 6 | +import org.bouncycastle.crypto.digests.SM3Digest; | ||
| 7 | + | ||
| 8 | +import java.io.UnsupportedEncodingException; | ||
| 9 | +import java.net.URLDecoder; | ||
| 10 | +import java.security.MessageDigest; | ||
| 11 | +import java.security.NoSuchAlgorithmException; | ||
| 12 | +import java.util.Arrays; | ||
| 13 | + | ||
| 14 | +@Slf4j | ||
| 15 | +public class TokenUtils { | ||
| 16 | + | ||
| 17 | + private static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", | ||
| 18 | + "f" }; | ||
| 19 | + | ||
| 20 | + public static String getSignature(String pwd, String paramUrl) { | ||
| 21 | + | ||
| 22 | + | ||
| 23 | + if (StringUtils.isNotBlank(paramUrl)) { | ||
| 24 | + try { | ||
| 25 | + paramUrl = URLDecoder.decode(paramUrl, "UTF-8"); | ||
| 26 | + } catch (UnsupportedEncodingException e) { | ||
| 27 | + log.error("SM3生成signData失败:", e); | ||
| 28 | + throw new RuntimeException("生成signData失败:", e); | ||
| 29 | + } | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + String[] paraArray = new String[] {}; | ||
| 33 | + if (StringUtils.isNotBlank(paramUrl)) { | ||
| 34 | + String[] queryArray = paramUrl.split("&"); | ||
| 35 | + paraArray = (String[]) ArrayUtils.addAll(queryArray, paraArray); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + Arrays.sort(paraArray); | ||
| 39 | + | ||
| 40 | + StringBuffer buffer = new StringBuffer(); | ||
| 41 | + buffer.append(pwd); | ||
| 42 | + buffer.append(":"); | ||
| 43 | + | ||
| 44 | + for (int i = 0; i < paraArray.length; i++) { | ||
| 45 | + buffer.append(paraArray[i]); | ||
| 46 | + buffer.append("&"); | ||
| 47 | + } | ||
| 48 | + buffer.deleteCharAt(buffer.length() - 1); | ||
| 49 | + buffer.append(":"); | ||
| 50 | + buffer.append(pwd); | ||
| 51 | + | ||
| 52 | + MessageDigest md = null; | ||
| 53 | + SM3Digest digest = new SM3Digest(); | ||
| 54 | + String sm3Encode1 = ""; | ||
| 55 | + try { | ||
| 56 | + md = MessageDigest.getInstance("SHA-256"); | ||
| 57 | + md.update(buffer.toString().getBytes("UTF-8")); | ||
| 58 | + | ||
| 59 | + //SM3 | ||
| 60 | + digest.update(buffer.toString().getBytes("UTF-8"),0, buffer.length()); | ||
| 61 | + byte[] hashSM3 = new byte[digest.getDigestSize()]; | ||
| 62 | + digest.doFinal(hashSM3, 0); | ||
| 63 | + sm3Encode1 = byteArrayToHexString(hashSM3); | ||
| 64 | + log.info("[sm3Encode1] = {}" , sm3Encode1); | ||
| 65 | + | ||
| 66 | + } catch (NoSuchAlgorithmException e) { | ||
| 67 | + log.error("生成signData失败:", e); | ||
| 68 | + throw new RuntimeException("生成signData失败.", e); | ||
| 69 | + } catch (UnsupportedEncodingException e) { | ||
| 70 | + log.error("生成signData失败:", e); | ||
| 71 | + throw new RuntimeException("生成signData失败.", e); | ||
| 72 | + } | ||
| 73 | + String encode = byteArrayToHexString(md.digest()); | ||
| 74 | + log.info("[SHA256-ENCODE]={}" , encode); | ||
| 75 | + String sm3Encode = SM3EncryptUtil.passwordSm3(buffer.toString()); | ||
| 76 | + log.info("[sm3PasswordEncode] = {} " , sm3Encode); | ||
| 77 | + return sm3Encode; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + private static String byteArrayToHexString(byte[] byteArray) { | ||
| 81 | + StringBuffer sb = new StringBuffer(); | ||
| 82 | + for (byte byt : byteArray) { | ||
| 83 | + sb.append(byteToHexString(byt)); | ||
| 84 | + } | ||
| 85 | + return sb.toString(); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + private static String byteToHexString(byte byt) { | ||
| 89 | + int n = byt; | ||
| 90 | + if (n < 0) | ||
| 91 | + n = 256 + n; | ||
| 92 | + return hexDigits[n / 16] + hexDigits[n % 16]; | ||
| 93 | + } | ||
| 94 | +} |
-
请 注册 或 登录 后发表评论