fix(gateway): casdoor provisioning — 空 email 落 NULL 避免唯一键冲突;race 分支查重为空时显式报错
CodeQL Advanced / Analyze (actions) (push) Canceled after 0s
CodeQL Advanced / Analyze (java-kotlin) (push) Canceled after 0s
CodeQL Advanced / Analyze (javascript-typescript) (push) Canceled after 0s
CodeQL Advanced / Analyze (python) (push) Canceled after 0s
Docker Image Build & Push / manifest (push) Canceled after 0s
Docker Image Build & Push / build-and-push-arm (push) Canceled after 0s
Docker Image Build & Push / build-and-push-amd (push) Canceled after 0s
Gateway Docker Image CI / Build and Push Gateway Docker Image (push) Canceled after 0s

This commit is contained in:
figmar
2026-09-01 19:22:00 +08:00
parent 4e2ec55167
commit 13262aa4b1
@@ -84,6 +84,11 @@ public class CasdoorUserService {
// 并发首登:另一请求已建号 → 复用,避免唯一键冲突
log.info("casdoor provision race on [{}], reusing existing user", username);
created = findByUsername(username);
if (created == null) {
// 冲突来自 email 唯一键(用户名不冲突)→ 显式报错,避免 NPE
throw new CasdoorProvisionException(
"unique-key conflict but user not found (likely email collision): " + username);
}
}
log.info("casdoor auto-provisioned local user [{}] role={} groups={}",
username, created.getRole(), created.getUserGroups());
@@ -111,7 +116,9 @@ public class CasdoorUserService {
private User createUser(IdTokenClaims claims, String username, LocalDateTime now) {
User user = new User();
user.setUsername(username);
user.setEmail(claims.email());
// email 列有唯一约束:空串会互相冲突,空值统一落 NULL(NULL 不参与唯一约束)
String email = claims.email();
user.setEmail(email == null || email.isBlank() ? null : email.trim());
user.setFullName(claims.name());
// 本地密码不可用:随机占位(登录统一走 Casdoor,本地 BCrypt 仅迁移期兜底)
user.setPasswordHash(new BCryptPasswordEncoder(10).encode(UUID.randomUUID().toString()));