From 8422ed1d4bc3f7f8e1cdc1b97e55b44e803c2345 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 28 Apr 2026 20:36:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=AE=BE=E5=A4=87=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thirdparty/dto/ThirdIsVerifyDeviceTo.java | 10 ++++ .../controller/ThirdPartyOAth2Cotroller.java | 43 +++++++++++++++-- .../feign/RemoteUserTrustedDeviceService.java | 4 +- .../UserTrustedDeviceController.java | 48 ++++++++++--------- .../service/UserTrustedDeviceService.java | 4 +- .../impl/UserTrustedDeviceServiceImpl.java | 4 +- 6 files changed, 82 insertions(+), 31 deletions(-) diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ThirdIsVerifyDeviceTo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ThirdIsVerifyDeviceTo.java index 3ba41dd67..2d9237a90 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ThirdIsVerifyDeviceTo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ThirdIsVerifyDeviceTo.java @@ -15,4 +15,14 @@ public class ThirdIsVerifyDeviceTo { */ private Long userId; + /** + * 唯一值,小程序是openId + */ + private String uniqueCode; + + /** + * 设备信息 + */ + private String deviceJson; + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index c6e6a50a4..bb29441a8 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -34,6 +34,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; @@ -47,6 +48,9 @@ import java.util.concurrent.TimeUnit; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class ThirdPartyOAth2Cotroller { + static final String MINI_MAP_APP_DEVICE_NAME = "微信小程序设备认证"; + static final String SH_DEVICE_NAME = "诗画设备认证"; + private final ThirdPartyOAuth2Service thirdPartyOAuth2Service; private final RemoteUserService remoteUserService; @@ -222,7 +226,7 @@ public class ThirdPartyOAth2Cotroller { SysUser sysUser = sysUserList.get(0); //判断当前用户设备是否信任 String md5 = DeviceFingerprintUtil.generate(httpServletRequest); - R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(sysUser.getPhone(), md5); + R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(sysUser.getPhone(), md5, SH_DEVICE_NAME); UserTrustedDeviceEntity userTrustedDevice = userTrustedDeviceR.getData(); if (userTrustedDevice == null || userTrustedDevice.getExpireTime().isBefore(LocalDateTime.now())) { return R.failed(-1, "请先信任设备"); @@ -295,7 +299,7 @@ public class ThirdPartyOAth2Cotroller { // 2. 记录信任设备 //查询之前的是否有过期的数据,有就更新 String generate = DeviceFingerprintUtil.generate(httpServletRequest); - R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(dto.getMobilePhone(), generate); + R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(dto.getMobilePhone(), generate, SH_DEVICE_NAME); if (userTrustedDeviceR.getData() != null) { userTrustedDeviceR.getData().setExpireTime(LocalDateTime.now().plusMonths(3)); remoteUserTrustedDeviceService.updateById(userTrustedDeviceR.getData()); @@ -303,7 +307,38 @@ public class ThirdPartyOAth2Cotroller { UserTrustedDeviceEntity userTrustedDevice = new UserTrustedDeviceEntity(); userTrustedDevice.setMobilePhone(dto.getMobilePhone()); userTrustedDevice.setExpireTime(LocalDateTime.now().plusMonths(3)); - userTrustedDevice.setDeviceName("诗画设备认证"); + userTrustedDevice.setDeviceName(SH_DEVICE_NAME); + userTrustedDevice.setDeviceFingerprint(generate); + remoteUserTrustedDeviceService.save(userTrustedDevice); + } + return R.ok(); + } + + @PostMapping("/mini-app/verify-device") + @SysLog("小程序设备验证") + @Inner(value = false) + public R miniVerifyDevice(@RequestBody DeviceVerifyDTO dto, HttpServletRequest httpServletRequest) { + + // 1. 校验验证码 + String redisKey = "smsCode_" + dto.getMobilePhone(); + String storedCode = (String) redisTemplate.opsForValue().get(redisKey); + if (!dto.getCode().equals(storedCode)) { + return R.failed("验证码错误"); + } + // 验证成功后移除验证码(可选) + redisTemplate.delete(redisKey); + // 2. 记录信任设备 + //查询之前的是否有过期的数据,有就更新 + String generate = DeviceFingerprintUtil.generate(httpServletRequest); + R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(dto.getMobilePhone(), generate, MINI_MAP_APP_DEVICE_NAME); + if (userTrustedDeviceR.getData() != null) { + userTrustedDeviceR.getData().setExpireTime(LocalDateTime.now().plusMonths(3)); + remoteUserTrustedDeviceService.updateById(userTrustedDeviceR.getData()); + } else { + UserTrustedDeviceEntity userTrustedDevice = new UserTrustedDeviceEntity(); + userTrustedDevice.setMobilePhone(dto.getMobilePhone()); + userTrustedDevice.setExpireTime(LocalDateTime.now().plusMonths(3)); + userTrustedDevice.setDeviceName(MINI_MAP_APP_DEVICE_NAME); userTrustedDevice.setDeviceFingerprint(generate); remoteUserTrustedDeviceService.save(userTrustedDevice); } @@ -324,7 +359,7 @@ public class ThirdPartyOAth2Cotroller { } } String generate = DeviceFingerprintUtil.generate(httpServletRequest); - UserTrustedDeviceEntity userTrustedDevice = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(body.getMobile(), generate).getData(); + UserTrustedDeviceEntity userTrustedDevice = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(body.getMobile(), generate, MINI_MAP_APP_DEVICE_NAME).getData(); return R.ok(ObjectUtil.isNotEmpty(userTrustedDevice)); } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java index c917b5344..7c0eb61b0 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java @@ -48,8 +48,8 @@ public interface RemoteUserTrustedDeviceService { @NoToken - @GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5" ) - R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5); + @GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5") + R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName); @PostMapping("/userTrustedDevice/save") diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java index e80365561..0a674d082 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java @@ -30,22 +30,23 @@ import java.util.List; */ @RestController @RequiredArgsConstructor -@RequestMapping("/userTrustedDevice" ) -@Tag(description = "userTrustedDevice" , name = "设备指纹管理" ) +@RequestMapping("/userTrustedDevice") +@Tag(description = "userTrustedDevice", name = "设备指纹管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class UserTrustedDeviceController { - private final UserTrustedDeviceService userTrustedDeviceService; + private final UserTrustedDeviceService userTrustedDeviceService; /** * 分页查询 - * @param page 分页对象 + * + * @param page 分页对象 * @param userTrustedDevice 设备指纹 * @return */ - @Operation(summary = "分页查询" , description = "分页查询" ) - @GetMapping("/page" ) - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')" ) + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')") public R getUserTrustedDevicePage(@ParameterObject Page page, @ParameterObject UserTrustedDeviceEntity userTrustedDevice) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); return R.ok(userTrustedDeviceService.page(page, wrapper)); @@ -54,22 +55,24 @@ public class UserTrustedDeviceController { /** * 通过id查询设备指纹 + * * @param id id * @return R */ - @Operation(summary = "通过id查询" , description = "通过id查询" ) - @GetMapping("/{id}" ) - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')" ) - public R getById(@PathVariable("id" ) Long id) { + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')") + public R getById(@PathVariable("id") Long id) { return R.ok(userTrustedDeviceService.getById(id)); } /** * 新增设备指纹 + * * @param userTrustedDevice 设备指纹 * @return R */ - @Operation(summary = "新增设备指纹" , description = "新增设备指纹" ) + @Operation(summary = "新增设备指纹", description = "新增设备指纹") @PostMapping("/save") @Inner public R save(@RequestBody UserTrustedDeviceEntity userTrustedDevice) { @@ -78,11 +81,12 @@ public class UserTrustedDeviceController { /** * 修改设备指纹 + * * @param userTrustedDevice 设备指纹 * @return R */ - @Operation(summary = "修改设备指纹" , description = "修改设备指纹" ) - @SysLog("修改设备指纹" ) + @Operation(summary = "修改设备指纹", description = "修改设备指纹") + @SysLog("修改设备指纹") @PutMapping("/update") @Inner public R updateById(@RequestBody UserTrustedDeviceEntity userTrustedDevice) { @@ -91,23 +95,23 @@ public class UserTrustedDeviceController { /** * 通过id删除设备指纹 + * * @param ids id列表 * @return R */ - @Operation(summary = "通过id删除设备指纹" , description = "通过id删除设备指纹" ) - @SysLog("通过id删除设备指纹" ) + @Operation(summary = "通过id删除设备指纹", description = "通过id删除设备指纹") + @SysLog("通过id删除设备指纹") @DeleteMapping - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_del')" ) + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_del')") public R removeById(@RequestBody Long[] ids) { return R.ok(userTrustedDeviceService.removeBatchByIds(CollUtil.toList(ids))); } - - @Operation(summary = "通过md5和用户查询设备" , description = "通过md5和用户查询设备" ) - @GetMapping("/getUserTrustedDeviceByIdAndMD5" ) + @Operation(summary = "通过md5和用户查询设备", description = "通过md5和用户查询设备") + @GetMapping("/getUserTrustedDeviceByIdAndMD5") @Inner - public R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5) { - return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone,md5)); + public R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName) { + return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone, md5, deviceName)); } } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java index 14bc5a1e0..d2e468d95 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java @@ -8,12 +8,12 @@ public interface UserTrustedDeviceService extends IService userTrustedDeviceEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getMobilePhone, mobilePhone); userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceFingerprint, md5); + userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceName, deviceName); return baseMapper.selectOne(userTrustedDeviceEntityLambdaQueryWrapper); }