设备指纹引入

This commit is contained in:
zjf committed 2025-04-22 17:34:30 +08:00
1 parent 06167dd9e9
commit aa5281da83
8 files changed
+319 -5

No files matched your search

@@ -17,6 +17,7 @@ import com.bsd.pjcloud.thirdparty.entity.ThirdPartyUserEntity;
import com.bsd.pjcloud.thirdparty.service.SmsService;
import com.bsd.pjcloud.thirdparty.service.ThirdPartyOAuth2Service;
import com.bsd.pjcloud.thirdparty.service.ThirdPartyUserService;
import com.bsd.pjcloud.thirdparty.utils.DeviceFingerprintUtil;
import com.bsd.pjcloud.thirdparty.utils.SmsCodeUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -203,20 +204,21 @@ public class ThirdPartyOAth2Cotroller {
@Transactional
@GlobalTransactional
public R shjnsso(@RequestBody @Valid SHJNSSODTO shjnsso) {
//检查设备指纹
ZZDUserDTO zzdUserDTO = thirdPartyOAuth2Service.shjnsso(shjnsso.getAccountId(), shjnsso.getSessionId());
if (null==zzdUserDTO){
throw new RuntimeException("");
}
ZZDUserDTO.Ext ext = zzdUserDTO.getExt();
String mobile = zzdUserDTO.getMobile();
R<Map> r;
R<List<SysUser>> userByMobileOrEmployeeCode = remoteUserService.getUserByMobileOrEmployeeCode(null, mobile);
List<SysUser> sysUserList = userByMobileOrEmployeeCode.getData();
if(!CollectionUtils.isEmpty(sysUserList)){
//登录成功生成token
UserTokenDTO userTokenDTO = new UserTokenDTO();
userTokenDTO.setSysUser(sysUserList.get(0));
r=remoteTokenService.generateToken(userTokenDTO);
return remoteTokenService.generateToken(userTokenDTO);
}else {
//自动注册
// UserDTO userDTO = new UserDTO();
@@ -237,10 +239,25 @@ public class ThirdPartyOAth2Cotroller {
// r=remoteTokenService.generateToken(userTokenDTO);
return R.failed("系统中没有当前用户信息,请联系管理员进行申请!");
}
return r;
}
// 在shjnsso方法中添加验证
// @PostMapping("/shjnsso")
// public R shjnsso(..., HttpServletRequest request) {
// // 设备指纹验证
// String clientFingerprint = DeviceFingerprintUtil.generate(request);
// String storedFingerprint = redisTemplate.opsForValue().get("device_fp:" + shjnsso.getAccountId());
//
// if (!clientFingerprint.equals(storedFingerprint)) {
// // 新设备需要短信验证
// String code = SmsCodeUtil.generateNumberCode(6);
// smsService.sendSms(mobile, "验证码模板ID", Map.of("code", code));
// return R.failed("new_device").data("needSmsVerify", true);
// }
//
// // 原有逻辑继续执行...
// }
@Inner(value = false)
@GetMapping("/getAuthToken/{token}")
public R info(@PathVariable(name = "token") String token) {
@@ -269,14 +286,30 @@ public class ThirdPartyOAth2Cotroller {
@Operation(summary = "短信登录认证")
@SysLog("短信登录认证")
@Inner(value = false)
public R loginSms(@RequestParam String mobilePhone) {
public R loginSms(@RequestParam String mobilePhone,HttpServletRequest httpServletRequest) {
Map<String, String> stringHashMap = new LinkedHashMap<>();
String s = SmsCodeUtil.generateNumberCode(6);
stringHashMap.put("code",s);
stringHashMap.put("date","5");
System.out.println(WebUtils.getIP());
System.out.println(WebUtils.getIP(httpServletRequest));
smsService.sendSms(mobilePhone, "20657",stringHashMap, WebUtils.getIP());
redisTemplate.opsForSet().add("smsCode_"+mobilePhone,s, 5, TimeUnit.MINUTES);
//记录信任的设备
// 2. 记录信任设备
// String deviceFingerprint = DeviceFingerprintUtil.generate(request);
// deviceService.addTrustedDevice(
// dto.getUserId(),
// deviceFingerprint,
// LocalDateTime.now().plusMonths(3) // 信任3个月
// );
//
// // 3. 生成令牌
// User user = userService.getById(dto.getUserId());
// String token = jwtService.generateToken(user);
// return R.ok().data("token", token);
return R.ok();
}
@@ -0,0 +1,14 @@
package com.bsd.pjcloud.thirdparty.utils;
import com.bsd.pjcloud.common.core.util.WebUtils;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.DigestUtils;
public class DeviceFingerprintUtil {
public static String generate(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
String ip = WebUtils.getIP(request);
String accept = request.getHeader("Accept");
return DigestUtils.md5DigestAsHex((userAgent + ip + accept).getBytes());
}
}