mitao
2025-01-21 140a56d490d2f0f1b9829bd2c4186090deb52d3b
阿里云身份证二要素校验工具类
5个文件已修改
1个文件已添加
135 ■■■■■ 已修改文件
pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -43,6 +43,7 @@
        <spring-framework.version>5.3.39</spring-framework.version>
        <fastexcel.version>1.0.0</fastexcel.version>
        <aliyun-oss.version>3.17.4</aliyun-oss.version>
        <aliyun-cloudauth.version>3.4.1</aliyun-cloudauth.version>
    </properties>
    <!-- 依赖声明 -->
@@ -325,7 +326,11 @@
                <version>${aliyun-oss.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>cloudauth20190307</artifactId>
                <version>${aliyun-cloudauth.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -26,7 +26,6 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@@ -69,7 +68,7 @@
    }
    @Operation(summary = "管理端-修改密码")
    @GetMapping("/modify-pwd")
    @PostMapping("/modify-pwd")
    public R<?> modifyPwd(@Valid @RequestBody MgtPasswordDTO dto) {
        try {
            sysLoginService.modifyPwd(dto);
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -264,7 +264,7 @@
        if (Objects.isNull(sysUser)){
            throw new ServiceException("用户不存在");
        }
        if (!SecurityUtils.matchesPassword(SecurityUtils.encryptPassword(dto.getOldPassword()), sysUser.getPassword())){
        if (!SecurityUtils.matchesPassword(dto.getOldPassword(), sysUser.getPassword())){
            throw new ServiceException("原密码错误");
        }
        sysUser.setPassword(SecurityUtils.encryptPassword(dto.getNewPassword()));
ruoyi-modules/ruoyi-company/pom.xml
@@ -93,12 +93,15 @@
      <artifactId>ocr_api20210707</artifactId>
    </dependency>
    <dependency>
      <groupId>cn.idev.excel</groupId>
      <artifactId>fastexcel</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>cloudauth20190307</artifactId>
    </dependency>
  </dependencies>
  <build>
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java
@@ -17,6 +17,7 @@
import com.ruoyi.company.mapper.CompanyMapper;
import com.ruoyi.company.service.CompanyService;
import com.ruoyi.company.service.UserService;
import com.ruoyi.company.utils.AliyunCloudAuthUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -33,6 +34,7 @@
public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyService {
    private final UserService userService;
    private final HttpServletResponse response;
    private final AliyunCloudAuthUtil aliyunCloudAuthUtil;
    /**
     * 获取企业列表
     * @param query
@@ -41,12 +43,22 @@
    @Override
    public PageDTO<MgtCompanyVO> queryPage(MgtCompanyQuery query) {
        Page<Company> page = this.lambdaQuery()
                .like(StringUtils.isNotBlank(query.getCompanyInfo()), Company::getCompanyName, query.getCompanyInfo())
                .like(StringUtils.isNotBlank(query.getCompanyInfo()), Company::getSocialCode, query.getCompanyInfo())
                .like(StringUtils.isNotBlank(query.getLegalPersonInfo()), Company::getLegalPersonName, query.getLegalPersonInfo())
                .like(StringUtils.isNotBlank(query.getLegalPersonInfo()), Company::getIdCardNumber, query.getLegalPersonInfo())
                .like(StringUtils.isNotBlank(query.getContactInfo()), Company::getContactName, query.getContactInfo())
                .like(StringUtils.isNotBlank(query.getContactInfo()), Company::getContactPhone, query.getContactInfo())
                .and(StringUtils.isNotBlank(query.getCompanyInfo()),
                        queryWrapper -> queryWrapper
                                .like(Company::getCompanyName, query.getCompanyInfo())
                                .or()
                                .like(Company::getSocialCode, query.getCompanyInfo()))
                .and(StringUtils.isNotBlank(query.getLegalPersonInfo()),
                        queryWrapper -> queryWrapper
                                .like(Company::getLegalPersonName, query.getLegalPersonInfo())
                                .or()
                                .like(Company::getIdCardNumber, query.getLegalPersonInfo()))
                .and(StringUtils.isNotBlank(query.getContactInfo()),
                        queryWrapper -> queryWrapper
                                .like(Company::getContactName, query.getContactInfo())
                                .or()
                                .like(Company::getContactPhone, query.getContactInfo()))
                .orderByDesc(Company::getCreateTime)
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        return PageDTO.of(page,MgtCompanyVO.class);
    }
@@ -88,13 +100,18 @@
        User user = BeanUtils.copyBean(dto, User.class);
        user.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
        userService.save(user);
        // TODO 校验身份证信息
        Company company = BeanUtils.copyBean(dto, Company.class);
        company.setUserId(user.getUserId());
        //根据公司名称查询数据库
        Long count = this.lambdaQuery().eq(Company::getCompanyName, company.getCompanyName()).count();
        if (count > 0) {
            throw new ServiceException("该公司账号已存在");
        }
        //身份证二要素校验
        Boolean res = aliyunCloudAuthUtil.verifyIdCard(dto.getLegalPersonName(), dto.getIdCardNumber());
        if (!res) {
            throw new ServiceException("身份证信息不匹配");
        }
        this.save(company);
    }
@@ -133,6 +150,11 @@
        if (count > 0) {
            throw new ServiceException("该公司账号已存在");
        }
        //身份证二要素校验
        Boolean res = aliyunCloudAuthUtil.verifyIdCard(dto.getLegalPersonName(), dto.getIdCardNumber());
        if (!res) {
            throw new ServiceException("身份证信息不匹配");
        }
        Company companyUpd = BeanUtils.copyBean(dto, Company.class);
        companyUpd.setId(company.getId());
        this.updateById(companyUpd);
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java
New file
@@ -0,0 +1,80 @@
package com.ruoyi.company.utils;
import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson2.JSONObject;
import com.aliyun.cloudauth20190307.Client;
import com.aliyun.cloudauth20190307.models.Id2MetaVerifyResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * @author mitao
 * @date 2025/1/21
 */
@Slf4j
@Component
public class AliyunCloudAuthUtil {
    @Value("aliyun.accessKeyId")
    private String accessKeyId;
    @Value("aliyun.accessKeySecret")
    private String accessKeySecret;
    private Client createClient() throws Exception {
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
        Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(accessKeyId)
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Cloudauth
        config.endpoint = "cloudauth.aliyuncs.com";
        return new Client(config);
    }
    public Boolean verifyIdCard(String userName,String idCardNo) {
        //姓名第一个字密文+ 姓名其他部分明文。
        String firstCharacter = userName.substring(0, 1);
        userName =  DigestUtil.md5Hex(firstCharacter)+userName.substring(1);
        log.info("姓名:"+userName);
        //身份证号前6位(明文)+出生年月日(密文)+身份证号后4位(明文)。
        idCardNo = idCardNo.substring(0,6)+ DigestUtil.md5Hex(idCardNo.substring(6, 14)) +idCardNo.substring(14);
        log.info("身份证号:"+idCardNo);
        Client client = null;
        try {
            client = createClient();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        com.aliyun.cloudauth20190307.models.Id2MetaVerifyRequest id2MetaVerifyRequest = new com.aliyun.cloudauth20190307.models.Id2MetaVerifyRequest()
                .setParamType("md5")
                .setUserName(userName)
                .setIdentifyNum(idCardNo);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            Id2MetaVerifyResponse id2MetaVerifyResponse = client.id2MetaVerifyWithOptions(id2MetaVerifyRequest, runtime);
            log.info(JSONObject.toJSONString(id2MetaVerifyResponse));
            if (id2MetaVerifyResponse.getStatusCode().equals(200) && ("1").equals(id2MetaVerifyResponse.getBody().getResultObject().getBizCode())) {
                return true;
            }
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return false;
    }
}