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
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:
+8
-1
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user