Commit 1364a54c authored by 万建斌's avatar 万建斌

2019-10-21 优化

parent 8fa69882
......@@ -22,7 +22,8 @@ public enum ApiResponseEnum {
AUTH_SIGN_ERROR(10201,"签名验证失败"),
AUTH_IP_ERROR(10202,"IP白名单验证失败"),
AUTH_TOKEN_ERROR(10203, "token验证失败"),
TOKEN_OVERTIME_ERROR(10204, "token已过期")
TOKEN_OVERTIME_ERROR(10204, "token已过期"),
APPLY_TOKEN_ERROR(10205, "秘钥校对失败"),
;
public static String AUTH_CENTER_SERVICE = "kyb-search";
......
......@@ -4,8 +4,11 @@ import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.cesgroup.common.utils.http.HttpClientHelper;
import com.cesgroup.kingkong.entity.SecretKeyEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
......@@ -38,6 +41,7 @@ import java.util.*;
* @author: Wanjianbin
* @create: 2019-08-27 13:45
**/
@Slf4j
public class RSAEncryptUtil {
/**
* 签名算法
......@@ -72,13 +76,19 @@ public class RSAEncryptUtil {
// thread.start();
}*/
test1("CN200930231881.8");
Map map = new HashMap();
// map.put("id", "CN200930231881.8");
map.put("authorName", "李靖");
map.put("affilorg", "China Agricultural University");
map.put("current", "1");
test1(map);
}
public static void test1(String id){
public static void test1(Map map){
//生成公钥和私钥
Map keyMap = new HashMap();
keyMap.put("publicKey", "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJLuCIAqbnO1eunvgp3vby+2s0RnpNq3OFNpIQqStuTVIbedulgS2mEPASi9k5eHlc5n7MlHZMxdNRlBzo81EVa7bVCdS9nw2kMPNJoKLUX0RA8NFIYpkXakocDwCl1J8kNWuN1dMwQOZ7JPZQJaer9aAY/tu2aVpJG+CKTbQHRQIDAQAB");
keyMap.put("publicKey", "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQbyeSsNaEiK6DsEQ8IFM0cE55fKvCI0DQtBBF1v5ajv0oA0rzhvAV+QJoD93GnTzukOsq/UBW5WcHu/AHKn/BdzJcGwHfmDDMOfVIruu8sJDs8R/Sys39CPmajQAMOUYtXCmWAqVi0uqta+qlX5xRg7l4qK3dahQYUvuslKAVGQIDAQAB");
keyMap.put("privateKey", "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIku4IgCpuc7V66e+Cne9vL7azRGek2rc4U2khCpK25NUht526WBLaYQ8BKL2Tl4eVzmfsyUdkzF01GUHOjzURVrttUJ1L2fDaQw80mgotRfREDw0UhimRdqShwPAKXUnyQ1a43V0zBA5nsk9lAlp6v1oBj+27ZpWkkb4IpNtAdFAgMBAAECgYA8aHsRCXHrovMSfwgyj+9YwiPMCjjzGMuu3n/lfEkWsk+0r61sLP0oAo9k61ZFe2qd4RX3Cm0pk3dhlgJBBlwumHuX+E+i15gWJT/RBLzulJx6yUMs8SZsfLIyswHIuNUzhuCFk0GwzcHtG1w9VyQkklhUGebsCZbhKmNfdSsipQJBAMCiYmf4c+fdWBOJt+G094XKzchNtkB4QALBR9boJlbyOOqT4U/dNlPUb8PMs2GDfqhSML0lOL4Zg7hKWbpvtqMCQQC2TvtLnTBul2LfybClf0uWMsg9VXfIzkjuSJDlvprFksPaOnIBUI37s2CbWfOZJkgofeKPRPI+Tbl24nPhpvD3AkEAnHIE652bPF7GTi/V2Afp0o3vbFK4xkki61nfp0ipAon78X8iSINGwPRRxLn1oSdy8O63SJX3LGR6VmyDzOc3cwJATvlr9teDMYU2+ca/VRINxmT9RUSO/VgPU9nvmva0yT3IxfJnjJY+y3hrMyEGW6Ovwoq16GZvofm9i/iRRoExBQJAAjc8qZDi9PM0TrNc75V/xfUatKl52QWiCSFHn8biPYtKn02a3ZRnhp+Dk2UNRXSlnveULMa/tqI5MQ1VYleD6Q==");
System.out.println("随机生成的公钥为:" + MapUtils.getString(keyMap, "publicKey"));
......@@ -91,8 +101,6 @@ public class RSAEncryptUtil {
/*
* 拼接待签名字符串 RSA2对应的函数
*/
Map map = new HashMap();
map.put("id", id);
String content = AlipaySignature.rsaEncrypt(JSON.toJSONString(map), MapUtils.getString(keyMap, "publicKey"), CHARSET);
......@@ -109,9 +117,20 @@ public class RSAEncryptUtil {
Map result = JSON.parseObject(sign);
System.out.println(result);
}
catch (Exception e)
{
catch (Exception e){
e.printStackTrace();
String resultStr = "I0BhZQOTRtXt4H3gjVRm0rN55D1nfMLKaQd2CL4BGXmMzgQZa4hOYh5UqwjfFPCmcyytjscNfCblSwUonsDTopvgAtm3nJh2eI8K+4udQ3sAdmTBIkjLKXhoppocz6J4KPs8KtKfrMU6XYvMFBFF2KXJwCGIacFtmpkIo4+cCZVOj10T9ZpdUhceXqeQ2AoV7r6UqF2tV6av3Q0999yogVkYiczB5N9SaYNweOpuzIEFBjK0QJY6n4v64fPBx38dK3ntZzmAdg9Z4wSHrL1VX/aD+WGzTi4isTDL+JcDXc7M3Dk4xmqq56ktATWtfDGPG3lIRazyFmNYXBZoHZ48RgwAkgxRB904sYIf1WAXCtU9zN2Kb/zcCBWXGTgY3vmnG/kss6zfO1zChxumtW0YWR8D7X9K/S4mOMDNnh5kNS/Fxa/tXR4WStw1Qjw7mbiFMf+bkBtusd6GYZaEESotN5fKBuFHNr07UTN3/34mhc3mZmI0PacJTrAQRX3FV21S";
String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIku4IgCpuc7V66e+Cne9vL7azRGek2rc4U2khCpK25NUht526WBLaYQ8BKL2Tl4eVzmfsyUdkzF01GUHOjzURVrttUJ1L2fDaQw80mgotRfREDw0UhimRdqShwPAKXUnyQ1a43V0zBA5nsk9lAlp6v1oBj+27ZpWkkb4IpNtAdFAgMBAAECgYA8aHsRCXHrovMSfwgyj+9YwiPMCjjzGMuu3n/lfEkWsk+0r61sLP0oAo9k61ZFe2qd4RX3Cm0pk3dhlgJBBlwumHuX+E+i15gWJT/RBLzulJx6yUMs8SZsfLIyswHIuNUzhuCFk0GwzcHtG1w9VyQkklhUGebsCZbhKmNfdSsipQJBAMCiYmf4c+fdWBOJt+G094XKzchNtkB4QALBR9boJlbyOOqT4U/dNlPUb8PMs2GDfqhSML0lOL4Zg7hKWbpvtqMCQQC2TvtLnTBul2LfybClf0uWMsg9VXfIzkjuSJDlvprFksPaOnIBUI37s2CbWfOZJkgofeKPRPI+Tbl24nPhpvD3AkEAnHIE652bPF7GTi/V2Afp0o3vbFK4xkki61nfp0ipAon78X8iSINGwPRRxLn1oSdy8O63SJX3LGR6VmyDzOc3cwJATvlr9teDMYU2+ca/VRINxmT9RUSO/VgPU9nvmva0yT3IxfJnjJY+y3hrMyEGW6Ovwoq16GZvofm9i/iRRoExBQJAAjc8qZDi9PM0TrNc75V/xfUatKl52QWiCSFHn8biPYtKn02a3ZRnhp+Dk2UNRXSlnveULMa/tqI5MQ1VYleD6Q==";
try {
sign = AlipaySignature.rsaDecrypt(resultStr, privateKey, CHARSET);
System.out.println("原始sign:" + sign);
Map result = JSON.parseObject(sign);
System.out.println(result);
} catch (AlipayApiException ex) {
ex.printStackTrace();
}
}
}
......@@ -363,4 +382,27 @@ public class RSAEncryptUtil {
String outStr = new String(cipher.doFinal(inputByte));
return outStr;
}
/**
* @Description: 公钥解密
* @Param:
* @return:
* @Author: Wanjianbin
* @Date: 2019/8/27
*/
public static Map resolveParamsForSign(String sign, SecretKeyEntity secretKeyEntity) throws Exception{
if (StringUtils.isEmpty(sign)){
return null;
}
if(secretKeyEntity == null){
log.info("-------------------- secretKey SELECT ERROR --------------------");
return null;
}
String privateKey = secretKeyEntity.getPrivateKey();
return JSON.parseObject(AlipaySignature.rsaDecrypt(sign, privateKey, "UTF-8"));
}
}
package com.cesgroup.common.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
* Create by wanjianbin on 2019-05-18.<br>
*/
@Slf4j
public class RandomUtil {
public static String getStringRandom(int length, String charOrNum) {
String val = "";
Random random = new Random();
// 参数length,表示生成几位随机数
for (int i = 0; i < length; i++) {
if(StringUtils.isEmpty(charOrNum)) {
charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
}
// 输出字母还是数字
if ("char".equalsIgnoreCase(charOrNum)) {
// 输出是大写字母还是小写字母
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (random.nextInt(26) + temp);
} else if ("num".equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
public static void main(String[] args) {
String account = getStringRandom(6, "num");
log.info(account);
}
//字节数组转换为十六进制字符串
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
//生成随机字符串
private static String createNonceStr() {
return UUID.randomUUID().toString();
}
//生成时间戳
private static String createTimestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}
package com.cesgroup.common.utils;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.cesgroup.kingkong.entity.SecretKeyEntity;
import com.cesgroup.kingkong.service.SecretKeyService;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
......@@ -15,6 +24,10 @@ import java.util.Map;
//@ApiModel(value = "REST API接口统一响应接口实体")
public class RestAPIResult<T> implements Serializable {
private SecretKeyService secretKeyService;
final String CHARSET = "UTF-8";
/**
* serialVersionUID:
*
......@@ -65,7 +78,17 @@ public class RestAPIResult<T> implements Serializable {
}
public void setRespData(T respData) {
this.respData = respData;
if(respData != null){
String data = JSON.toJSONString(respData);
SecretKeyEntity secretKeyEntity = secretKeyService.getById(1);
String publicKey = secretKeyEntity.getPublicKey();
try {
String content = AlipaySignature.rsaEncrypt(data, publicKey, CHARSET);
this.respData = (T) content;
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
}
public Map<String, Object> getRespMap() {
......@@ -109,15 +132,16 @@ public class RestAPIResult<T> implements Serializable {
}
@SuppressWarnings("unchecked")
public RestAPIResult() {
public RestAPIResult(SecretKeyService secretKeyService) {
this.secretKeyService = secretKeyService;
this.respData = (T) new Object();
this.respMap = new HashMap<String, Object>();
}
public void success(T object) {
public void success(T object, SecretKeyService secretKeyService) {
this.respCode = 1;
this.respMsg = "1";
this.respData = object;
setRespData(object);
this.respMap = new HashMap<String, Object>();
}
......
......@@ -71,13 +71,12 @@ public class TokenInterceptor implements HandlerInterceptor {
ApiResponse apiResponse =null;
String token = request.getHeader("token");
// String remoteAddr = ApiResultUtil.getUserIP(request);
String remoteAddr = "127.0.0.1";
if(StringUtil.isEmpty(token)){
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_TOKEN_ERROR);
}else {
IPCheckEntity ipCheckEntity = ipCheckService.getOne(new QueryWrapper<IPCheckEntity>().eq("ip_address", remoteAddr));
IPCheckEntity ipCheckEntity = ipCheckService.getOne(new QueryWrapper<IPCheckEntity>().eq("token", token));
if(ipCheckEntity != null){
if (token.equals(ipCheckEntity.getToken())){
// if (token.equals(ipCheckEntity.getToken())){
// 校验token是否过期
if(checkToken(ipCheckEntity)){
/* if (checkSign(params)){
......@@ -89,19 +88,7 @@ public class TokenInterceptor implements HandlerInterceptor {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_SIGN_ERROR);
}*/
try {
Map<String, Object> requestParams = resolveParamsForSign(params);
log.info("--------------------SET PARAMS BEGIN--------------------");
for (Map.Entry entry : requestParams.entrySet()){
log.info(entry.getKey() + " : " + entry.getValue());
request.setAttribute(entry.getKey().toString(), entry.getValue());
}
log.info("--------------------SET PARAMS END----------------------");
return true;
}catch (Exception e){
e.printStackTrace();
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_SIGN_ERROR);
}
return true;
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.TOKEN_OVERTIME_ERROR);
......@@ -109,9 +96,9 @@ public class TokenInterceptor implements HandlerInterceptor {
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_TOKEN_ERROR);
}
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_IP_ERROR);
}
// }else {
// apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_IP_ERROR);
// }
}
response.setCharacterEncoding("utf-8");
......@@ -160,29 +147,6 @@ public class TokenInterceptor implements HandlerInterceptor {
}
/**
* @Description: 公钥解密
* @Param:
* @return:
* @Author: Wanjianbin
* @Date: 2019/8/27
*/
private Map resolveParamsForSign(Map params) throws Exception{
String sign = MapUtils.getString(params, "sign");
if (StringUtils.isEmpty(sign)){
return null;
}
SecretKeyEntity secretKeyEntity = secretKeyService.getById(1);
if(secretKeyEntity == null){
log.info("-------------------- secretKey SELECT ERROR --------------------");
return null;
}
String privateKey = secretKeyEntity.getPrivateKey();
return JSON.parseObject(AlipaySignature.rsaDecrypt(sign, privateKey, "UTF-8"));
}
/**
* 是否有权限
*
* @param handler
......
......@@ -2,6 +2,9 @@ package com.cesgroup.kingkong.web;
import java.util.*;
import com.cesgroup.common.utils.RSAEncryptUtil;
import com.cesgroup.kingkong.service.SecretKeyService;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -15,14 +18,17 @@ import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("v1")
public class SearchContrllor {
@Autowired
SecretKeyService secretKeyService;
@Autowired
private QueryService queryService;
@RequestMapping(value = "queryById", method = { RequestMethod.POST })
public RestAPIResult<Object> query(HttpServletRequest request) {
String id = request.getAttribute("id").toString();
RestAPIResult<Object> panResult = new RestAPIResult<Object>();
public RestAPIResult<Object> query(String sign) throws Exception {
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
String id = MapUtils.getString(params, "id");
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
Map<String, Object> result = null;
if(StringUtils.isNotBlank(id)) {
result =queryService.getById(id);
......@@ -63,13 +69,10 @@ public class SearchContrllor {
* RestAPIResult<Object>
*/
@RequestMapping(value = "queryArticleInfo", method = { RequestMethod.POST })
public RestAPIResult<Object> queryArticleInfo(HttpServletRequest request) {
Map<String, Object> params = new HashMap<>();
params.put("authorName", request.getAttribute("authorName"));
params.put("current", request.getAttribute("current"));
params.put("affilorg", request.getAttribute("affilorg"));
public RestAPIResult<Object> queryArticleInfo(String sign) throws Exception {
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
RestAPIResult<Object> panResult = new RestAPIResult<Object>();
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
Map<String, Object> result = queryService.queryArticleInfo(params);
if(result == null || result.size() <= 0){
// 未查出数据时,去掉机构名后重新查询
......@@ -77,7 +80,9 @@ public class SearchContrllor {
result = queryService.queryArticleInfo(params);
}
panResult.setRespData(parseResult(result));
Map<String, Object> resMap = new HashMap<>();
resMap.put("result", parseResult(result));
panResult.setRespData(resMap);
return panResult;
}
......
package com.cesgroup.kingkong.web;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cesgroup.common.utils.ApiResponse;
import com.cesgroup.common.utils.ApiResponseEnum;
import com.cesgroup.common.utils.ApiResultUtil;
import com.cesgroup.common.utils.*;
import com.cesgroup.kingkong.commons.utils.JwtUtils;
import com.cesgroup.kingkong.core.security.model.JwtUser;
import com.cesgroup.kingkong.entity.IPCheckEntity;
import com.cesgroup.kingkong.interceptor.RequiredPermission;
import com.cesgroup.kingkong.service.IPCheckService;
import com.cesgroup.kingkong.service.SecretKeyService;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: kyb-search
......@@ -26,27 +31,61 @@ import java.util.Date;
@RequestMapping("/token")
public class TokenController extends BaseServiceController<IPCheckEntity, IPCheckService> {
@Autowired
SecretKeyService secretKeyService;
@PostMapping("/getToken")
@RequiredPermission
public ApiResponse getToken(HttpServletRequest request){
String ip = ApiResultUtil.getUserIP(request);
public RestAPIResult<Object> getToken(String sign) throws Exception {
// String ip = ApiResultUtil.getUserIP(request);
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
String ip = MapUtils.getString(params, "randomStr");
IPCheckEntity ipCheckEntity = this.service.getOne(new QueryWrapper<IPCheckEntity>().eq("ip_address", ip));
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
if(ipCheckEntity == null){
return ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_IP_ERROR);
panResult.error(ApiResponseEnum.AUTH_IP_ERROR.getErrMsg());
}else {
JwtUser user = new JwtUser();
user.setId(ipCheckEntity.getId().toString());
user.setUserName(ip);
user.setLoginName(ip);
String token = JwtUtils.createJwtBySimpleUser(user, 1000 * 60 * 60 * 24, ApiResponseEnum.AUTH_CENTER_SERVICE);
ipCheckEntity.setToken(token);
ipCheckEntity.setLastTokenTime(new Date().getTime());
this.service.updateById(ipCheckEntity);
panResult.setRespData(token);
}
JwtUser user = new JwtUser();
user.setId(ipCheckEntity.getId().toString());
user.setUserName(ip);
user.setLoginName(ip);
return panResult;
}
String token = JwtUtils.createJwtBySimpleUser(user, 1000*60*60*24, ApiResponseEnum.AUTH_CENTER_SERVICE);
ipCheckEntity.setToken(token);
ipCheckEntity.setLastTokenTime(new Date().getTime());
this.service.updateById(ipCheckEntity);
@GetMapping("/applyToken")
@RequiredPermission
public RestAPIResult<Object> applyToken(String sign) throws Exception {
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
String applyDate = MapUtils.getString(params, "applyDate");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date());
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
if(today.equals(applyDate)){
Map<String, Object> result = new HashMap<>();
result.put("today", today);
String randomStr = RandomUtil.getStringRandom(12, null);
result.put("randomStr", randomStr);
return ApiResultUtil.getApiResponse(token, ApiResponseEnum.SUCCESS);
IPCheckEntity ipCheckEntity = new IPCheckEntity();
ipCheckEntity.setId(1);
ipCheckEntity.setIpAddress(randomStr);
this.service.updateById(ipCheckEntity);
panResult.setRespData(result);
}else {
panResult.error(ApiResponseEnum.APPLY_TOKEN_ERROR.getErrMsg());
}
return panResult;
}
@RequestMapping("/test")
public ApiResponse test(){
return ApiResultUtil.getApiResponse(null, ApiResponseEnum.SUCCESS);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment