From a54447507a3af4347e6b5981eb9da21d5ca03898 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 03 十一月 2026 13:27:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_tide_wrzs' into dev_tide_wrzs

---
 src/main/java/com/ruoyi/framework/security/service/SysLoginService.java |   57 ++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/tide/controller/TideController.java             |   10 +++-
 2 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
index f379b7f..8b3e83a 100644
--- a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
+++ b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
@@ -10,10 +10,13 @@
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.enums.UserStatus;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.user.BlackListException;
 import com.ruoyi.common.exception.user.CaptchaException;
@@ -45,8 +48,13 @@
 @Component
 public class SysLoginService
 {
+    private static final Logger log = LoggerFactory.getLogger(SysLoginService.class);
+
     @Autowired
     private TokenService tokenService;
+
+    @Autowired
+    private UserDetailsServiceImpl userDetailsService;
 
     @Resource
     private AuthenticationManager authenticationManager;
@@ -281,4 +289,53 @@
         return tokenService.createToken(loginUser);
     }
 
+    /**
+     * 娴疆闂ㄦ埛 SSO 鍏嶅瘑鐧诲綍
+     * <p>
+     * 鑳屾櫙锛氭氮娼� OSS 閫氳繃 /tide/tideLogin 鎶� code 鎹㈡垚 token锛屽啀鍙栧埌 tenant 淇℃伅鍚庯紝
+     * 鍘熸湰璋冪敤 login(username, password, code, uuid) 鐢� tenantAccount + tenantPassword
+     * 鍋氭湰鍦扮櫥褰曘�備絾 tenantPassword 鏄氮娼郴缁熻鎯呴噷鍗曠嫭閰嶇疆鐨勫�硷紝涓庢湰鍦� sys_user.password
+     * 涓�鏃︿笉涓�鑷达紙娴疆渚ф敼瀵嗙爜銆佹湰鍦伴噸缃瘑鐮併�佽处鍙风敱 applicationOrdering 鍒涘缓鍚庢敼杩囧瘑鐮佺瓑锛夛紝
+     * 灏变細鎶ャ�岀鎴疯处鍙穂xxx]鍦ㄧ郴缁熶腑鐧诲綍澶辫触(鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒)銆嶏紝瀵艰嚧闂ㄦ埛鏁存潯鐧诲綍閾捐矾鏂帀銆�
+     * <p>
+     * 閴存潈瀹為檯涓婂湪娴疆渚у凡缁忓畬鎴愶紙鑳芥嬁鍒版湁鏁� token 鍜� userInfo 灏辫鏄庤韩浠藉彲淇★級锛�
+     * 鏈湴鏃犻渶鍐嶆鏍¢獙瀵嗙爜銆傝繖閲岀洿鎺ユ寜鐢ㄦ埛鍚嶅姞杞界敤鎴峰苟绛惧彂鏈郴缁� token銆�
+     * <p>
+     * 浠嶇劧淇濈暀鐨勬牎楠岋細鐢ㄦ埛涓嶅瓨鍦ㄣ�佸凡鍒犻櫎銆佸凡鍋滅敤 鈥斺�� 杩欎笁绉嶆儏鍐垫嫆缁濈櫥褰曘��
+     *
+     * @param username 娴疆杩斿洖鐨勭鎴疯处鍙凤紙tenantAccount锛�
+     * @return 鏈郴缁� token
+     */
+    public String ssoLogin(String username)
+    {
+        SysUser user = userService.selectUserByUserName(username);
+        if (StringUtils.isNull(user))
+        {
+            log.info("SSO 鐧诲綍锛氱敤鎴� {} 涓嶅瓨鍦�.", username);
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
+                    MessageUtils.message("user.not.exists")));
+            throw new UserNotExistsException();
+        }
+        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+        {
+            log.info("SSO 鐧诲綍锛氱敤鎴� {} 宸茶鍒犻櫎.", username);
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
+                    MessageUtils.message("user.password.delete")));
+            throw new ServiceException(MessageUtils.message("user.password.delete"));
+        }
+        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            log.info("SSO 鐧诲綍锛氱敤鎴� {} 宸茶鍋滅敤.", username);
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
+                    MessageUtils.message("user.blocked")));
+            throw new ServiceException(MessageUtils.message("user.blocked"));
+        }
+        // 鍏嶅瘑锛氱洿鎺ユ瀯閫� LoginUser锛堜笉璋冪敤 passwordService.validate锛�
+        LoginUser loginUser = (LoginUser) userDetailsService.createLoginUser(user);
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS,
+                "娴疆闂ㄦ埛 SSO 鐧诲綍"));
+        recordLoginInfo(user.getUserId());
+        return tokenService.createToken(loginUser);
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/tide/controller/TideController.java b/src/main/java/com/ruoyi/tide/controller/TideController.java
index 0128b59..33cac85 100644
--- a/src/main/java/com/ruoyi/tide/controller/TideController.java
+++ b/src/main/java/com/ruoyi/tide/controller/TideController.java
@@ -105,12 +105,16 @@
         if (ObjectUtils.isEmpty(password)) {
             password = firstText(userInfo, "tenantPassword", "password", "pwd");
         }
-        if (ObjectUtils.isEmpty(account) || ObjectUtils.isEmpty(password)) {
-            log.error("[娴疆SSO] 鏈彇鍒扮鎴疯处鍙�/瀵嗙爜, userInfo={}", userInfo);
+        // 鍏嶅瘑鐧诲綍鍙渶璐﹀彿锛沺assword 浠呬綔鏃ュ織鍙傝�冿紝娴疆渚т笉杩斿洖涔熶笉褰卞搷鐧诲綍
+        if (ObjectUtils.isEmpty(account)) {
+            log.error("[娴疆SSO] 鏈彇鍒扮鎴疯处鍙�, userInfo={}", userInfo);
             return AjaxResult.error("娴疆鏈繑鍥炰紒涓氱鎴疯处鍙蜂俊鎭紝璇疯仈绯诲钩鍙扮鐞嗗憳妫�鏌ヨ璐﹀彿鐨勪紒涓氱粦瀹�");
         }
         try {
-            String generateToken = loginService.login(account, password, null, IdWorker.get32UUID());
+            // 娴疆渚у凡瀹屾垚韬唤璁よ瘉锛坈ode 鎹� token 鈫� 鍙� userInfo锛夛紝鏈湴涓嶅啀鐢� tenantPassword 浜屾鏍¢獙銆�
+            // 鍘熷疄鐜� login(account, password, ...) 鍦ㄦ氮娼厤缃殑瀵嗙爜涓庢湰鍦� sys_user.password 涓嶄竴鑷存椂
+            // 浼氭姏 UserPasswordNotMatchException锛岃〃鐜颁负銆岀鎴疯处鍙穂xxx]鍦ㄧ郴缁熶腑鐧诲綍澶辫触(鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒)銆嶃��
+            String generateToken = loginService.ssoLogin(account);
             AjaxResult ajax = AjaxResult.success();
             ajax.put(Constants.TOKEN, generateToken);
             return ajax;

--
Gitblit v1.9.3