From 0e12e4ab45db6768a0f45d8952f78b0ae9190723 Mon Sep 17 00:00:00 2001 From: ZQN <364596817@qq.com> Date: 星期一, 19 五月 2025 16:09:01 +0800 Subject: [PATCH] 手机号登录,去掉短信验证。脱敏 --- project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java | 214 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 187 insertions(+), 27 deletions(-) diff --git a/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java b/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java index 1f8d563..e622e67 100644 --- a/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java +++ b/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java @@ -1,20 +1,23 @@ package com.project.framework.web.service; -import javax.annotation.Resource; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.project.common.constant.AliyunSmsConstants; import com.project.common.constant.CacheConstants; import com.project.common.constant.Constants; import com.project.common.core.domain.entity.SysUser; import com.project.common.core.domain.model.LoginUser; import com.project.common.core.redis.RedisCache; import com.project.common.exception.ServiceException; +import com.project.common.exception.base.BaseException; import com.project.common.exception.user.CaptchaException; import com.project.common.exception.user.CaptchaExpireException; import com.project.common.exception.user.UserPasswordNotMatchException; @@ -26,36 +29,44 @@ import com.project.framework.manager.AsyncManager; import com.project.framework.manager.factory.AsyncFactory; import com.project.framework.security.context.AuthenticationContextHolder; +import com.project.system.domain.bo.editBo.UserPhoneLoginBo; +import com.project.system.mapper.SysUserMapper; import com.project.system.service.ISysConfigService; import com.project.system.service.ISysUserService; +import com.project.system.sms.YPSmsApi; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import java.util.Random; +import java.util.concurrent.TimeUnit; /** * 鐧诲綍鏍¢獙鏂规硶 - * + * * @author project */ @Component @Slf4j +@RequiredArgsConstructor public class SysLoginService { - @Autowired - private TokenService tokenService; + private final TokenService tokenService; + private final AuthenticationManager authenticationManager; + private final RedisCache redisCache; + private final ISysUserService userService; + private final SysUserMapper userMapper; + private final ISysConfigService configService; + private final YPSmsApi smsApi; - @Resource - private AuthenticationManager authenticationManager; - - @Autowired - private RedisCache redisCache; - - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; /** * 鐧诲綍楠岃瘉 - * + * * @param username 鐢ㄦ埛鍚� * @param password 瀵嗙爜 * @param code 楠岃瘉鐮� @@ -71,7 +82,7 @@ validateCaptcha(username, code, uuid); } // 鐢ㄦ埛楠岃瘉 - Authentication authentication = null; + Authentication authentication; try { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); @@ -105,12 +116,126 @@ } /** + * 鏂版敞鍐岃幏鍙栭獙璇佺爜 + * @param phone 鎵嬫満 + * @return 楠岃瘉鐮� + */ + public Boolean getVerifyCodeNew(String phone) { + // 鐢熸垚4浣嶉殢鏈烘暟 + String code = ""; + Random ran = new Random(); + int randomNum = ran.nextInt(10000); + code = String.format("%04d", randomNum); + log.info("鎵嬫満鍙凤細"+phone+"->楠岃瘉鐮侊細"+code); + boolean send = sendYp(phone, code); + if (send){ + redisCache.setCacheObject(getCacheKey(phone), code, Constants.PHONE_EXPIRATION, TimeUnit.MINUTES); + return true; + } + redisCache.setCacheObject(getCacheKey(phone), code, Constants.PHONE_EXPIRATION, TimeUnit.MINUTES); + return false; + } + + /** + * 鑾峰彇楠岃瘉鐮� + * @param phone 鎵嬫満鍙� + * @return 楠岃瘉鐮� + */ + public Boolean getVerifyCode(String phone) + { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber,phone)); + if (user==null){ + throw new BaseException("鎮ㄦ墜鏈哄彿灏氭湭娉ㄥ唽锛�"); + } + return getVerifyCodeNew(phone); + } + + /** + * 浜戠墖楠岃瘉鐮� + * @param phone 鎵嬫満 + * @param code 楠岃瘉鐮� + * @return 缁撴灉 + */ + private boolean sendYp(String phone, String code) + { + String result = smsApi.sendSms(phone, StringUtils.format(YPSmsApi.CODE_TMP, code, Constants.PHONE_EXPIRATION)); + if (result.contains("\"code\":0,\"msg\":\"OK\"")){ + log.info("鍙戦�佹垚鍔� ->楠岃瘉鐮侊細"+code); + return true; + } + return false; + } + + /** + * 闃块噷楠岃瘉鐮� + * @param phone 鎵嬫満 + * @param code 楠岃瘉鐮� + * @return 缁撴灉 + */ + private boolean sendAl(String phone, String code ) + { + DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", AliyunSmsConstants.SMS_APPID, AliyunSmsConstants.SMS_SECRET); + IAcsClient client = new DefaultAcsClient(profile); + CommonRequest request = new CommonRequest(); + request.setMethod(MethodType.POST); + request.setDomain("dysmsapi.aliyuncs.com"); + request.setVersion("2017-05-25"); + request.setAction("SendSms"); + request.putQueryParameter("PhoneNumbers", phone); + request.putQueryParameter("SignName", "鐩涘晢鐝犲疂"); + request.putQueryParameter("TemplateCode", "SMS_460945884"); + request.putQueryParameter("TemplateParam", "{code:" + code + "}"); + try { + CommonResponse response = client.getCommonResponse(request); + JSONObject jsonObject = JSON.parseObject(response.getData()); + if ("OK".equals(jsonObject.get("Code"))) { + log.info("鍙戦�佹垚鍔� ->楠岃瘉鐮侊細"+code); + return true; + } + } catch (ClientException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 楠岃瘉鐮佺櫥褰� + * @param bo 鍙傛暟 + * @return 缁撴灉 + */ + public String phoneLogin(UserPhoneLoginBo bo) + { + String phone = bo.getPhone(); +// Boolean verified = verifyPhone(phone, bo.getCode()); +// if (!verified){ +// throw new BaseException("鎵嬫満鍙烽獙璇佺爜鏍¢獙澶辫触锛�"); +// } + SysUser user = null; + if ("01".equals(bo.getUserType())){ + user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() + .eq(SysUser::getPhonenumber,bo.getPhone()) + .and(wrapper->wrapper.eq(SysUser::getUserType,"00").or().eq(SysUser::getUserType, "01"))); + } else { + user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() + .eq(SysUser::getPhonenumber,bo.getPhone()) + .eq(SysUser::getUserType,bo.getUserType()) + ); + } + if (user==null){ + throw new BaseException("鎮ㄦ墜鏈哄彿灏氭湭娉ㄥ唽鎴栨偍閫夋嫨鐧诲綍绫诲瀷鏈夎锛�"); + } + if (!"0".equals(user.getStatus())){ + throw new BaseException("鎮ㄨ处鍙峰凡鍋滅敤鎴栧緟瀹℃壒锛岃鑱旂郴钀ュ晢鍔炵鐞嗕汉鍛橈紒"); + } + return this.login(user.getUserName(), user.getRecommendUser(), null, null); + } + + /** * 鏍¢獙楠岃瘉鐮� - * + * * @param username 鐢ㄦ埛鍚� * @param code 楠岃瘉鐮� * @param uuid 鍞竴鏍囪瘑 - * @return 缁撴灉 */ public void validateCaptcha(String username, String code, String uuid) { @@ -142,4 +267,39 @@ sysUser.setLoginDate(DateUtils.getNowDate()); userService.updateUserProfile(sysUser); } + + + /** + * 鑾峰彇楠岃瘉鐮佸墠缂� + * @param phone 鎵嬫満鍙� + * @return 楠岃瘉鐮� + */ + private String getCacheKey(String phone) + { + return CacheConstants.PHONE_CODE_KEY + phone; + } + + /** + * 鏍¢獙楠岃瘉鐮� + * @param phone 鎵嬫満鍙� + * @param code 楠岃瘉鐮� + * @return 鏍¢獙缁撴灉 + */ + public Boolean verifyPhone(String phone, String code) + { + String key = getCacheKey(phone); + if (!redisCache.hasKey(key)) { + return false; + } + String redisCode = redisCache.getCacheObject(key); + + boolean verify = redisCode.equals(code); + if (verify){ + redisCache.deleteObject(getCacheKey(phone)); + } + + return verify; + } + + } -- Gitblit v1.9.1