feat:设备授权问题

This commit is contained in:
dzc committed 2026-04-28 20:36:01 +08:00
1 parent 2332dfba38
commit 8422ed1d4b
6 files changed
+82 -31

No files matched your search

@@ -15,4 +15,14 @@ public class ThirdIsVerifyDeviceTo {
*/
private Long userId;
/**
* 唯一值,小程序是openId
*/
private String uniqueCode;
/**
* 设备信息
*/
private String deviceJson;
}
@@ -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<UserTrustedDeviceEntity> userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(sysUser.getPhone(), md5);
R<UserTrustedDeviceEntity> 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<UserTrustedDeviceEntity> userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(dto.getMobilePhone(), generate);
R<UserTrustedDeviceEntity> 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<UserTrustedDeviceEntity> 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));
}
@@ -48,8 +48,8 @@ public interface RemoteUserTrustedDeviceService {
@NoToken
@GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5" )
R<UserTrustedDeviceEntity> getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5);
@GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5")
R<UserTrustedDeviceEntity> getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName);
@PostMapping("/userTrustedDevice/save")
@@ -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<UserTrustedDeviceEntity> 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<UserTrustedDeviceEntity> getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5) {
return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone,md5));
public R<UserTrustedDeviceEntity> getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName) {
return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone, md5, deviceName));
}
}
@@ -8,12 +8,12 @@ public interface UserTrustedDeviceService extends IService<UserTrustedDeviceEnti
/**
* 新增
*
* @param userTrustedDevice
* @return
*/
Object saveUserTruste(UserTrustedDeviceEntity userTrustedDevice);
UserTrustedDeviceEntity getUserTrustedDeviceByIdAndMD5(String mobilePhone, String md5);
UserTrustedDeviceEntity getUserTrustedDeviceByIdAndMD5(String mobilePhone, String md, String deviceName);
}
@@ -8,6 +8,7 @@ import com.bsd.pjcloud.admin.service.UserTrustedDeviceService;
import com.bsd.pjcloud.common.core.util.DeviceFingerprintUtil;
import com.bsd.pjcloud.common.core.util.WebUtils;
import org.springframework.stereotype.Service;
/**
* 设备指纹
*
@@ -22,10 +23,11 @@ public class UserTrustedDeviceServiceImpl extends ServiceImpl<UserTrustedDeviceM
}
@Override
public UserTrustedDeviceEntity getUserTrustedDeviceByIdAndMD5(String mobilePhone, String md5) {
public UserTrustedDeviceEntity getUserTrustedDeviceByIdAndMD5(String mobilePhone, String md5, String deviceName) {
LambdaQueryWrapper<UserTrustedDeviceEntity> userTrustedDeviceEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getMobilePhone, mobilePhone);
userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceFingerprint, md5);
userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceName, deviceName);
return baseMapper.selectOne(userTrustedDeviceEntityLambdaQueryWrapper);
}