|
|
@@ -1,5 +1,6 @@
|
|
|
package cn.iocoder.yudao.module.system.service.auth;
|
|
|
|
|
|
+import cn.hutool.core.lang.Assert;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
|
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
|
@@ -15,6 +16,7 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
|
|
|
import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.user.UserCharacteristicDO;
|
|
|
import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
|
|
|
@@ -25,9 +27,13 @@ import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
|
|
import cn.iocoder.yudao.module.system.service.social.SocialUserService;
|
|
|
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
|
+import cn.iocoder.yudao.module.system.service.usercharacteristic.UserCharacteristicService;
|
|
|
+import cn.iocoder.yudao.module.system.util.login.FingerprintComparisonByDat;
|
|
|
+import cn.iocoder.yudao.module.system.util.login.VerificationVO;
|
|
|
import com.anji.captcha.model.common.ResponseModel;
|
|
|
import com.anji.captcha.model.vo.CaptchaVO;
|
|
|
import com.anji.captcha.service.CaptchaService;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import jakarta.validation.Validator;
|
|
|
@@ -37,7 +43,11 @@ import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
@@ -73,6 +83,9 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|
|
private RoleService roleService;
|
|
|
@Resource
|
|
|
private StringRedisTemplate stringRedisTemplate;
|
|
|
+ @Resource
|
|
|
+ private UserCharacteristicService userCharacteristicService;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 验证码的开关,默认为 true
|
|
|
@@ -392,4 +405,27 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|
|
// addAuthenticate(user, username);
|
|
|
return user;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AuthLoginRespVO loginByFingerprintDat(MultipartFile file) throws IOException {
|
|
|
+ Assert.isTrue(file.getSize() > 0, "输入的指纹不能为空!");
|
|
|
+ // 获取所有的用户指纹
|
|
|
+ List<UserCharacteristicDO> list = userCharacteristicService.list(Wrappers.<UserCharacteristicDO>lambdaQuery()
|
|
|
+ .eq(UserCharacteristicDO::getType, "1"));
|
|
|
+ Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
|
|
|
+ List<String> collect = list.stream().map(UserCharacteristicDO::getContent).toList();
|
|
|
+ // 通过指纹获取最相似的用户
|
|
|
+ VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, new HashSet<>(collect));
|
|
|
+ Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
|
|
|
+ String fingerprint = verificationVO.getFingerprint();
|
|
|
+ UserCharacteristicDO one = userCharacteristicService.getOne(Wrappers.<UserCharacteristicDO>lambdaQuery()
|
|
|
+ .eq(UserCharacteristicDO::getContent, fingerprint)
|
|
|
+ .last("limit 1"));
|
|
|
+ AdminUserDO sysUser = userService.getById(one.getUserId());
|
|
|
+ // 开始无密登录
|
|
|
+ AuthLoginRespVO authLoginRespVO = passwordFreeLogin(new AuthPasswordFreeLoginReqVO().setUsername(sysUser.getUsername()));
|
|
|
+ return authLoginRespVO;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|