Trick 6 роки тому
батько
коміт
eba1d7a4b0

+ 1 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java

@ -264,6 +264,7 @@ public class BaseRequestMapping {
        public static final String findWxReplyScene ="/findWxReplyScene";
        public static final String saveWxTemp ="/saveWxTemp";
        public static final String findWxTempExist ="/findWxTempExist";
        public static final String findWxTempNameExist ="/findWxTempNameExist";
        public static final String findWxtemp ="/findWxtemp";
        public static final String saveWxTempConfig ="/saveWxTempConfig";
        public static final String findWxTempConfigList ="/findWxTempConfigList";

+ 4 - 0
server/svr-authentication/pom.xml

@ -105,6 +105,10 @@
            <artifactId>utils</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-rest-model</artifactId>
        </dependency>
    </dependencies>

+ 1 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublicKey.java

@ -1,6 +1,7 @@
package com.yihu.jw.security.model;
import java.io.Serializable;
import java.math.BigInteger;
/**
 * Model 公钥

+ 16 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublickeyVO.java

@ -0,0 +1,16 @@
package com.yihu.jw.security.model;
/**
 * Created by Trick on 2018/10/22.
 */
public class PublickeyVO {
    private String publicKey;
    public String getPublicKey() {
        return publicKey;
    }
    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }
}

+ 28 - 11
server/svr-authentication/src/main/java/com/yihu/jw/security/oauth2/provider/endpoint/WlyyLoginEndpoint.java

@ -1,16 +1,17 @@
package com.yihu.jw.security.oauth2.provider.endpoint;
import com.yihu.jw.restmodel.base.wx.WxTemplateConfigVO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.security.core.userdetails.jdbc.WlyyUserDetailsService;
import com.yihu.jw.security.model.Captcha;
import com.yihu.jw.security.model.Oauth2Envelop;
import com.yihu.jw.security.model.PublicKey;
import com.yihu.jw.security.model.WlyyUserSimple;
import com.yihu.jw.security.model.*;
import com.yihu.jw.security.oauth2.core.redis.WlyyRedisVerifyCodeService;
import com.yihu.jw.security.oauth2.provider.WlyyTokenGranter;
import com.yihu.jw.security.oauth2.provider.error.WlyyOAuth2ExceptionTranslator;
import com.yihu.utils.security.RSAUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -45,6 +46,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
@ -121,12 +123,14 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        if (StringUtils.isEmpty(parameters.get("captcha"))) {
            parameters.put("grant_type", "password");
            //解密密码
//            if (parameters.get("password") != null) {
            if (parameters.get("password") != null) {
//                RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)httpSession.getAttribute("privateKey");
////                byte[] en_data = Hex.decodeHex(parameters.get("password").toCharArray());
////                parameters.put("password", RSAUtils.decryptByPrivateKey(new String(en_data), rsaPrivateKey));
//                parameters.put("password", RSAUtils.decryptByPrivateKey(new String(Base64.decodeBase64(parameters.get("password"))), rsaPrivateKey));
//            }
                KeyPair keyPair = (KeyPair)httpSession.getAttribute("privateKey");
//                parameters.put("password", RSAUtils.decryptByPrivateKey(parameters.get("password"), rsaPrivateKey));
                String password = com.yihu.jw.security.utils.RSAUtils.decryptBase64(parameters.get("password"),keyPair);
                parameters.put("password",password);
//                parameters.put("password", RSAUtils.decryptByPrivateKey(parameters.get("password"), rsaPrivateKey));
            }
        } else {
            parameters.put("grant_type", "captcha");
        }
@ -249,8 +253,12 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        RSAPublicKey rsaPublicKey = (RSAPublicKey) map.get("public");
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) map.get("private");
        PublicKey publicKey = new PublicKey();
        publicKey.setModulus(Base64.encodeBase64String(rsaPublicKey.getModulus().toByteArray()));
        publicKey.setExponent(Base64.encodeBase64String(rsaPublicKey.getPublicExponent().toByteArray()));
        publicKey.setModulus(rsaPublicKey.getModulus().toString(16));
        publicKey.setExponent(rsaPublicKey.getPublicExponent().toString(16));
//        publicKey.setModulus(Base64.encodeBase64String(rsaPublicKey.getModulus().toByteArray()));
//        publicKey.setExponent(Base64.encodeBase64String(rsaPublicKey.getPublicExponent().toByteArray()));
//        publicKey.setModulus(new String(Hex.encodeHex(rsaPublicKey.getModulus().toByteArray())));
//        publicKey.setExponent(new String(Hex.encodeHex(rsaPublicKey.getPublicExponent().toByteArray())));
        httpSession.setAttribute("privateKey", rsaPrivateKey);
@ -266,6 +274,15 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
    }
    @RequestMapping(value = "/oauth/getPublicKey", method = RequestMethod.GET)
    public ObjEnvelop<PublickeyVO> getPublicKey(HttpSession httpSession, HttpServletResponse httpServletResponse){
        KeyPair keyPair =  com.yihu.jw.security.utils.RSAUtils.getKey();
        httpSession.setAttribute("privateKey", keyPair);
        PublickeyVO pk = new PublickeyVO();
        pk.setPublicKey(com.yihu.jw.security.utils.RSAUtils.generateBase64PublicKey(keyPair));
        return ObjEnvelop.getSuccess("success",pk);
    }
    /**
     * 获取验证码
     * @param parameters

+ 71 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/utils/RSAUtils.java

@ -0,0 +1,71 @@
package com.yihu.jw.security.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class RSAUtils {
//    private static final KeyPair keyPair = initKey();
    public static KeyPair getKey(){
        try {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            SecureRandom random = new SecureRandom();
            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
            generator.initialize(1024, random);
            return generator.generateKeyPair();
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 生成public key
     * @return
     */
    public static String generateBase64PublicKey(KeyPair keyPair){
        RSAPublicKey key = (RSAPublicKey)keyPair.getPublic();
        return new String(Base64.encodeBase64(key.getEncoded()));
    }
    /**
     * 解密
     * @param string
     * @return
     */
    public static String decryptBase64(String string,KeyPair keyPair) {
        return new String(decrypt(Base64.decodeBase64(string),keyPair));
    }
    private static byte[] decrypt(byte[] string,KeyPair keyPair) {
        try {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
            RSAPrivateKey pbk = (RSAPrivateKey)keyPair.getPrivate();
            cipher.init(Cipher.DECRYPT_MODE, pbk);
            byte[] plainText = cipher.doFinal(string);
            return plainText;
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
//    public static void main(String[] args) {
//
//        KeyPair keyPair =  initKey();
//        // 生成public key
//        System.out.println(generateBase64PublicKey(keyPair));
//
//        // 解密
//        System.out.println(decryptBase64("wAfY9JkoKay9SxcPIs1FcG+t6sR+wYwAs/mh9DpfcBraxzqoZdb9LyaAigzFQ0EKck9OyHL0dhv+Uxuw5hHw6CPT0B2Z0i1gwrjDUNaL1gWvqt1pDJVGrIYPLJSjs9xktFhY1jbxQgXGjyCt06Rwid5sJknw90AUO0CyQulfipg=",keyPair));
//    }
}

+ 2 - 2
svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxTemplateDao.java

@ -19,8 +19,8 @@ public interface WxTemplateDao extends PagingAndSortingRepository<WxTemplateDO,
    @Query("from WxTemplateDO w where w.wechatId = ?1 and w.status =1")
    List<WxTemplateDO> findByWxId(String wechatId);
    List<WxTemplateDO> findByTemplateIdAndWechatId(String templateId,String wechatId);
    List<WxTemplateDO> findByTemplateIdAndWechatIdAndStatus(String templateId,String wechatId,Integer status);
    List<WxTemplateDO> findByTemplateNameAndWechatId(String templateId,String wechatId);
    List<WxTemplateDO> findByTemplateNameAndWechatIdAndStatus(String templateId,String wechatId,Integer status);
}

+ 14 - 4
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/wx/WechatController.java

@ -256,17 +256,27 @@ public class WechatController extends EnvelopRestEndpoint {
        return wechatService.saveWxTemp(wxTemplate);
    }
    @PostMapping(value = BaseRequestMapping.WeChat.findWxTempExist)
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTempExist)
    @ApiOperation(value = "判断微信模板(模板id且模板名称)是否存在", notes = "判断微信模板(模板id且模板名称)是否存在")
    public Envelop findWxTempExist(@ApiParam(name = "wechatId", value = "微信id")
                                   @RequestParam(value = "wechatId", required = true)String wechatId,
                                   @ApiParam(name = "templateName", value = "微信id")
                                   @ApiParam(name = "templateName", value = "微信模板名称")
                                   @RequestParam(value = "templateName", required = true)String templateName,
                                   @ApiParam(name = "templateId", value = "微信模板id(微信的同步的id)")
                                   @RequestParam(value = "templateId", required = true)String templateId) {
       return success(BaseRequestMapping.WeChat.api_success,wechatService.findWxTempExist(wechatId,templateId,templateName));
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTempNameExist)
    @ApiOperation(value = "判断微信模板(模板名称)是否存在", notes = "判断微信模板(模板名称)是否存在")
    public Envelop findWxTempNameExist(@ApiParam(name = "wechatId", value = "微信id")
                                       @RequestParam(value = "wechatId", required = true)String wechatId,
                                       @ApiParam(name = "templateName", value = "微信模板名称")
                                       @RequestParam(value = "templateName", required = true)String templateName) {
        return success(BaseRequestMapping.WeChat.api_success,wechatService.findWxTempNameExist(wechatId,templateName));
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxtemp)
    @ApiOperation(value = "获取微信模板消息基础信息(列表)", notes = "获取微信模板消息基础信息(列表)")
    public MixEnvelop<WxTemplateVO,WxTemplateVO> findWxtemp(@ApiParam(name = "wechatId", value = "微信id")
@ -297,9 +307,9 @@ public class WechatController extends EnvelopRestEndpoint {
    public MixEnvelop<WxTemplateConfigVO,WxTemplateConfigVO> findWxTempConfigList(@ApiParam(name = "wechatId", value = "微信id")
                                                                                  @RequestParam(value = "wechatId", required = true)String wechatId,
                                                                                  @ApiParam(name = "scene", value = "微信场景值")
                                                                                  @RequestParam(value = "scene", required = true)String scene,
                                                                                  @RequestParam(value = "scene", required = false)String scene,
                                                                                  @ApiParam(name = "templateId", value = "微信公众号模板id")
                                                                                  @RequestParam(value = "templateId", required = true)String templateId,
                                                                                  @RequestParam(value = "templateId", required = false)String templateId,
                                                                                  @ApiParam(name = "page", value = "第几页")
                                                                                  @RequestParam(value = "page", required = true)Integer page,
                                                                                  @ApiParam(name = "size", value = "分页大小")

+ 11 - 4
svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WechatService.java

@ -461,11 +461,19 @@ public class WechatService {
    }
    public Boolean findWxTempExist(String wechatId,String templateId,String templateName){
        List<WxTemplateDO> list = wxTemplateDao.findByTemplateIdAndWechatId(templateId,wechatId);
        List<WxTemplateDO> list = wxTemplateDao.findByTemplateIdAndWechatIdAndStatus(templateId,wechatId,1);
        if(list!=null&&list.size()>0){
            return true;
        }
        List<WxTemplateDO> list2 = wxTemplateDao.findByTemplateNameAndWechatId(templateName,wechatId);
        List<WxTemplateDO> list2 = wxTemplateDao.findByTemplateNameAndWechatIdAndStatus(templateName,wechatId,1);
        if(list2!=null&&list2.size()>0){
            return true;
        }
        return false;
    }
    public Boolean findWxTempNameExist(String wechatId,String templateName){
        List<WxTemplateDO> list2 = wxTemplateDao.findByTemplateNameAndWechatIdAndStatus(templateName,wechatId,1);
        if(list2!=null&&list2.size()>0){
            return true;
        }
@ -573,7 +581,7 @@ public class WechatService {
            sql += " AND g.scene = '"+scene+"'";
        }
        if(StringUtils.isNotBlank(templateId)){
            totalSql += " AND g.template_id = '"+templateId+"'";
            sql += " AND g.template_id = '"+templateId+"'";
        }
        sql+=" LIMIT  " + (page - 1) * size + "," + size + "";
        List<WxTemplateConfigVO> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper(WxTemplateConfigVO.class));
@ -590,7 +598,6 @@ public class WechatService {
        if(list!=null&&list.size()>0){
            return true;
        }
        return false;
    }