From f6b3eb7863149c610b9f0f745ed9e0b1591b55b5 Mon Sep 17 00:00:00 2001 From: khalil Date: Fri, 14 Mar 2025 12:03:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E7=AE=B1-=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/accompany/common/redis/RedisKey.java | 4 ++ .../service/MyUserDetailsServiceImpl.java | 4 +- .../service/account/AccountManageService.java | 60 +++++++++++++++++++ .../config/AuthorizationServerConfig.java | 3 +- .../oauth2/config/SecurityConfig.java | 11 +++- 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java index 4ae306306..1d3969b66 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java @@ -511,6 +511,10 @@ public enum RedisKey { * 手机号注册分布式锁 **/ lock_register_by_phone, + /** + * 手机号注册分布式锁 + **/ + lock_register_by_email, /** * 短信验证码 **/ diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/MyUserDetailsServiceImpl.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/MyUserDetailsServiceImpl.java index 5df42fa8c..b045881d6 100644 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/MyUserDetailsServiceImpl.java +++ b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/MyUserDetailsServiceImpl.java @@ -128,8 +128,8 @@ public class MyUserDetailsServiceImpl implements MyUserDetailsService { } @Override - public UserDetails loadUserByEmail(String email, String code, DeviceInfo deviceInfo, String ipAddress) throws Exception { - Account account = accountService.getAccountByEmail(email); + public UserDetails loadUserByEmail(String email, String code, DeviceInfo deviceInfo, String ipAddress) { + Account account = accountManageService.getOrGenAccountByEmail(email, code, deviceInfo, ipAddress); if (account == null) { throw new CustomOAuth2Exception(CustomOAuth2Exception.USER_NOT_EXISTED, BusiStatus.USER_NOT_EXISTED.getReasonPhrase()); diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java index 9b0ae075d..adc13db95 100644 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java +++ b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java @@ -31,6 +31,7 @@ import com.accompany.oauth2.event.UserRegisterSuccessEvent; import com.accompany.oauth2.exception.CustomOAuth2Exception; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -108,6 +109,33 @@ public class AccountManageService { } + public Account getOrGenAccountByEmail(String email, String code, DeviceInfo deviceInfo, String ipAddress) { + log.info("getOrGenAccountByPhone email:{},code:{}", email, code); + String lockVal = jedisLockService.lock(RedisKey.lock_register_by_email.getKey(email)); + try { + if (BlankUtil.isBlank(lockVal)) { + throw new ServiceException(BusiStatus.REQUEST_FAST); + } + Account account = accountService.getAccountByEmail(email); + if (account == null) { + account = saveSignUpByEmail(email, null, deviceInfo, ipAddress); + } else { + String state = account.getState(); + if (Constant.AccountState.block.equals(state)) { + throw new CustomOAuth2Exception(CustomOAuth2Exception.INVALID_USER, + "用户账号异常,请联系官方客服uid=" + account.getUid()); + } + account.setLastLoginTime(new Date()); + account.setLastLoginIp(ipAddress); + account.setUpdateTime(new Date()); + accountService.updateById(account); + } + return account; + } finally { + jedisLockService.unlock(RedisKey.lock_register_by_email.getKey(email), lockVal); + } + } + public Account getOrGenAccountByOpenid(String openid, Byte type, DeviceInfo deviceInfo, String ipAddress, String unionId) throws Exception { log.info("getOrGenAccountByOpenid openId:{},type:{},unionId:{}", openid, type, unionId); final String locKey = RedisKey.lock_register_by_openid.getKey(openid, unionId, String.valueOf(type)); @@ -220,6 +248,38 @@ public class AccountManageService { } + @SneakyThrows + private Account saveSignUpByEmail(String email, String password, DeviceInfo deviceInfo, String ipAddress) { + checkRegisterLimit(deviceInfo.getDeviceId(), ipAddress); + + Date date = new Date(); + Account account = new Account(); + account.setEmail(email); + if (StringUtils.hasText(password)) { + account.setPassword(encryptPassword(password)); + } + account.setNeteaseToken(UUIDUtil.get()); + account.setLastLoginTime(date); + account.setLastLoginIp(ipAddress); + account.setUpdateTime(date); + account.setRegisterIp(ipAddress); + account.setSignTime(date); + account.setState(Constant.AccountState.normal); + account.setErbanNo(erBanNoService.getErBanNo()); + account = fillDeviceInfo(account, deviceInfo); + + accountMapper.insert(account); + accountService.writeAche(account); + String uidStr = String.valueOf(account.getUid()); + TokenRet tokenRet = netEaseService.createNetEaseAcc(uidStr, account.getNeteaseToken(), "", "", null); + if (tokenRet.getCode() != 200) { + log.error("邮件email {} 注册异常,异常原因code {}", email, tokenRet.getCode()); + throw new ServiceException(BusiStatus.SERVERBUSY); + } + applicationContext.publishEvent(new UserRegisterSuccessEvent(account)); + return account; + } + /** * 通过手机号码注册,独立账号系统,不掺杂业务 * diff --git a/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/AuthorizationServerConfig.java b/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/AuthorizationServerConfig.java index b73d809b5..02f916226 100644 --- a/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/AuthorizationServerConfig.java +++ b/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/AuthorizationServerConfig.java @@ -67,7 +67,8 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap GrantTypeEnum.REFRESH_TOKEN.getValue(), GrantTypeEnum.OPENID.getValue(), GrantTypeEnum.APPLE.getValue(), - GrantTypeEnum.VERIFY_CODE.getValue() + GrantTypeEnum.VERIFY_CODE.getValue(), + GrantTypeEnum.EMAIL.getValue() ).scopes("read", "write") .authorities("oauth2") .secret(finalSecret) diff --git a/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/SecurityConfig.java b/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/SecurityConfig.java index 74f176f8e..0bb2528ab 100644 --- a/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/SecurityConfig.java +++ b/accompany-oauth2/accompany-oauth2-web/src/main/java/com/accompany/oauth2/config/SecurityConfig.java @@ -5,6 +5,7 @@ import com.accompany.core.service.user.PhoneBlackService; import com.accompany.oauth2.service.MyUserDetailsService; import com.accompany.oauth2.service.MyUserDetailsServiceImpl; import com.accompany.oauth2.service.account.AccountH5LoginService; +import com.accompany.oauth2.support.email.EmailAuthenticationProvider; import com.accompany.oauth2.support.h5.H5TokenGranter; import com.accompany.oauth2.support.h5.PasswordH5TokenGranter; import com.accompany.oauth2.support.h5.VerifyCodeH5TokenGranter; @@ -48,7 +49,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { } @Bean - PasswordEncoder passwordEncoder() { + public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @@ -70,7 +71,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) { auth.authenticationProvider(passwordAuthenticationProvider()) - .authenticationProvider(verifyCodeAuthenticationProvider()); + .authenticationProvider(verifyCodeAuthenticationProvider()) + .authenticationProvider(eamilAuthenticationProvider()); } @Bean @@ -83,6 +85,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { return new VerifyCodeAuthenticationProvider(myUserDetailsService(), phoneBlackService); } + @Bean + public AuthenticationProvider eamilAuthenticationProvider() { + return new EmailAuthenticationProvider(myUserDetailsService()); + } + @Bean public H5TokenGranter passwordH5TokenGranter() { return new PasswordH5TokenGranter(myUserDetailsService(), accountH5LoginService);