From 69c2c400e6e3393424d704742cd9de0e6da07e2f Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期一, 27 四月 2026 20:12:30 +0800
Subject: [PATCH] fix:ios授权登录
---
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppAuthService.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppAuthService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppAuthService.java
index 9f8270d..2e2c384 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppAuthService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppAuthService.java
@@ -4,6 +4,7 @@
import com.tcm.training.admin.app.auth.dto.AppPasswordLoginRequest;
import com.tcm.training.admin.app.auth.dto.AppPasswordResetRequest;
import com.tcm.training.admin.app.auth.dto.AppPasswordResetVerifyRequest;
+import com.tcm.training.admin.app.auth.dto.AppAppleLoginRequest;
import com.tcm.training.admin.app.auth.dto.AppSmsCodeSendRequest;
import com.tcm.training.admin.app.auth.dto.AppSmsLoginRequest;
import com.tcm.training.admin.app.auth.dto.AppWechatLoginRequest;
@@ -39,6 +40,7 @@
private final BCryptPasswordEncoder passwordEncoder;
private final AppAuthSessionService appAuthSessionService;
private final AppWechatAuthClient appWechatAuthClient;
+ private final AppAppleAuthClient appAppleAuthClient;
private final StringRedisTemplate stringRedisTemplate;
/**
@@ -49,12 +51,14 @@
BCryptPasswordEncoder passwordEncoder,
AppAuthSessionService appAuthSessionService,
AppWechatAuthClient appWechatAuthClient,
+ AppAppleAuthClient appAppleAuthClient,
StringRedisTemplate stringRedisTemplate) {
this.userMapper = userMapper;
this.appSmsCodeService = appSmsCodeService;
this.passwordEncoder = passwordEncoder;
this.appAuthSessionService = appAuthSessionService;
this.appWechatAuthClient = appWechatAuthClient;
+ this.appAppleAuthClient = appAppleAuthClient;
this.stringRedisTemplate = stringRedisTemplate;
}
@@ -114,6 +118,25 @@
requireEnabledUser(user);
// 登录时同步微信专用资料,并仅在本地昵称头像为空时补齐展示字段。
applyWechatProfile(user, profile, false);
+ userMapper.updateById(user);
+ return createLoginResponse(user);
+ }
+
+ /**
+ * 使用苹果授权结果完成 APP 登录,首次登录自动创建普通用户。
+ */
+ public AppLoginResponse appleLogin(AppAppleLoginRequest request) {
+ AppAppleUserProfile profile = appAppleAuthClient.resolveUserProfile(request);
+ AppUser user = findUserByAppleSubject(profile.getSubject());
+ if (user == null) {
+ user = buildAppleUser(profile);
+ userMapper.insert(user);
+ return createLoginResponse(user);
+ }
+
+ requireEnabledUser(user);
+ // 登录时同步苹果绑定标识,避免历史账号缺少最新 subject 或绑定时间。
+ applyAppleProfile(user, profile, false);
userMapper.updateById(user);
return createLoginResponse(user);
}
@@ -227,6 +250,16 @@
}
/**
+ * 按苹果 subject 查询本地 APP 用户。
+ */
+ private AppUser findUserByAppleSubject(String subject) {
+ return userMapper.selectOne(new LambdaQueryWrapper<AppUser>()
+ .eq(AppUser::getAppleIdentitySubject, subject)
+ .eq(AppUser::getDeleted, 0)
+ .last("limit 1"));
+ }
+
+ /**
* 基于微信资料构造首次登录时的本地普通用户。
*/
private AppUser buildWechatUser(AppWechatUserProfile profile) {
@@ -234,6 +267,17 @@
user.setType(0);
user.setStatus(1);
applyWechatProfile(user, profile, true);
+ return user;
+ }
+
+ /**
+ * 基于苹果资料构造首次登录时的本地普通用户。
+ */
+ private AppUser buildAppleUser(AppAppleUserProfile profile) {
+ AppUser user = new AppUser();
+ user.setType(0);
+ user.setStatus(1);
+ applyAppleProfile(user, profile, true);
return user;
}
@@ -261,6 +305,19 @@
}
/**
+ * 将苹果资料回填到本地用户,并在首次自动建号时补齐基础展示昵称。
+ */
+ private void applyAppleProfile(AppUser user, AppAppleUserProfile profile, boolean syncLocalProfile) {
+ user.setAppleUserIdentifier(trimToNull(profile.getUserIdentifier()));
+ user.setAppleIdentitySubject(trimToNull(profile.getSubject()));
+ user.setAppleBoundAt(LocalDateTime.now());
+
+ if (syncLocalProfile || trimToNull(user.getNickname()) == null) {
+ user.setNickname("苹果用户");
+ }
+ }
+
+ /**
* 将微信性别值转换为本地用户性别枚举。
*/
private Integer resolveWechatGender(Integer sex) {
--
Gitblit v1.7.1