From 365a1a1eacc425c858a661b7ffa14a7270bb1634 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 30 九月 2026 14:27:04 +0800
Subject: [PATCH] fix(auth): 修复企业微信扫码登录换 profile 必抛空指针,并给自动注册账号绑默认角色

---
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
index 656dc96..dbdb45e 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
@@ -16,6 +16,7 @@
 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
 import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
@@ -26,6 +27,8 @@
 import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
 import cn.iocoder.yudao.module.system.service.member.MemberService;
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
+import cn.iocoder.yudao.module.system.service.permission.PermissionService;
+import cn.iocoder.yudao.module.system.service.permission.RoleService;
 import cn.iocoder.yudao.module.system.service.social.SocialUserService;
 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import com.anji.captcha.model.common.ResponseModel;
@@ -43,6 +46,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Objects;
+import java.util.Set;
 import java.util.UUID;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -62,6 +66,14 @@
      * 浼佷笟寰俊绀句氦绫诲瀷锛屽搴� {@link cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum#WECHAT_ENTERPRISE}
      */
     private static final Integer WECHAT_ENTERPRISE_TYPE = 30;
+
+    /**
+     * 浼佷笟寰俊鎵爜鑷姩娉ㄥ唽鐨勮处鍙凤紝榛樿缁戝畾鐨勮鑹茬紪鐮併��
+     *
+     * 闇�瑕佸湪銆岀郴缁熺鐞� 鈫� 瑙掕壊绠$悊銆嶉噷寤哄ソ璇ョ紪鐮佺殑瑙掕壊骞跺嬀閫夎彍鍗曪紝鍚﹀垯鏂拌处鍙风櫥褰曞悗娌℃湁浠讳綍鑿滃崟銆�
+     * 缂栫爜鑰岄潪瑙掕壊缂栧彿锛氳鑹茬紪鍙峰湪鏈湴/娴嬭瘯/鐢熶骇鍚勫簱涓嶄竴鑷达紝鍐欐浼氬湪鎹㈠簱鍚庨潤榛樺け鏁堛��
+     */
+    private static final String WXCP_DEFAULT_ROLE_CODE = "wxcp_user";
 
     @Resource
     private AdminUserService userService;
@@ -85,6 +97,10 @@
     private PasswordEncoder passwordEncoder;
     @Resource
     private ApplicationEventPublisher eventPublisher;
+    @Resource
+    private RoleService roleService;
+    @Resource
+    private PermissionService permissionService;
 
     /**
      * 楠岃瘉鐮佺殑寮�鍏筹紝榛樿涓� true
@@ -267,9 +283,35 @@
         user.setStatus(CommonStatusEnum.ENABLE.getStatus());
         userMapper.insert(user);
 
+        // 5. 缁戝畾榛樿瑙掕壊
+        //    涓嶇粦鐨勮瘽璐﹀彿鑳界櫥褰曪紝浣� get-permission-info 杩斿洖绌鸿彍鍗曪紝杩涘幓涓�鐗囩┖鐧斤紱
+        //    杩欑"鑳借繘浣嗕粈涔堥兘鐪嬩笉鍒�"鐨勭姸鎬佷笉浼氭姤閿欙紝寰堥毦瀹氫綅锛屾墍浠ユ敞鍐屾椂灏辩粦涓�
+        bindDefaultRole(user);
+
         return user;
     }
 
+    /**
+     * 缁欒嚜鍔ㄦ敞鍐岀殑璐﹀彿缁戝畾榛樿瑙掕壊
+     *
+     * 瑙掕壊涓嶅瓨鍦ㄦ椂鍙墦璀﹀憡銆佷笉鎶涘紓甯革細涓�涓厤缃仐婕忎笉搴旇璁╂壂鐮佺櫥褰曟暣鏉¢摼璺笉鍙敤锛�
+     * 鑰屼笖璀﹀憡鏃ュ織閲屽凡缁忓啓鏄庝簡鍘诲摢鍎胯ˉ銆�
+     *
+     * @param user 鑷姩娉ㄥ唽鍑烘潵鐨勭敤鎴�
+     */
+    private void bindDefaultRole(AdminUserDO user) {
+        RoleDO role = roleService.getRoleByCode(WXCP_DEFAULT_ROLE_CODE);
+        if (role == null) {
+            log.warn("[bindDefaultRole][瑙掕壊缂栫爜({}) 涓嶅瓨鍦紝鐢ㄦ埛({}) 灏嗘病鏈変换浣曡彍鍗曟潈闄愶紱" +
+                            "璇峰湪銆岀郴缁熺鐞� 鈫� 瑙掕壊绠$悊銆嶆柊寤虹紪鐮佷负 {} 鐨勮鑹插苟鍒嗛厤鑿滃崟]",
+                    WXCP_DEFAULT_ROLE_CODE, user.getUsername(), WXCP_DEFAULT_ROLE_CODE);
+            return;
+        }
+        permissionService.assignUserRole(user.getId(), Set.of(role.getId()));
+        log.info("[bindDefaultRole][鐢ㄦ埛({}) 宸茬粦瀹氶粯璁よ鑹�({}/{})]",
+                user.getUsername(), role.getCode(), role.getName());
+    }
+
     @VisibleForTesting
     void validateCaptcha(AuthLoginReqVO reqVO) {
         ResponseModel response = doValidateCaptcha(reqVO);

--
Gitblit v1.9.3