From 8f63d5ce747106195b279e1c158fd12f9997a770 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 18 三月 2025 19:08:40 +0800
Subject: [PATCH] 检验任务代码迁移&爱尚平台对接测试

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java |  208 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 206 insertions(+), 2 deletions(-)

diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index fe16427..40581ba 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -1,7 +1,29 @@
 package com.ruoyi.framework.web.service;
 
 import javax.annotation.Resource;
+import javax.net.ssl.SSLContext;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.config.SsoBean;
+import com.ruoyi.framework.model.SsoOauthTokenModel;
+import com.ruoyi.framework.model.SsoUserInfoModel;
+import com.ruoyi.framework.web.ssoAuth.SsoCodeAuthenticationToken;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.http.NameValuePair;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -29,11 +51,23 @@
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
 /**
  * 鐧诲綍鏍¢獙鏂规硶
  * 
  * @author ruoyi
  */
+@Slf4j
 @Component
 public class SysLoginService
 {
@@ -47,10 +81,17 @@
     private RedisCache redisCache;
     
     @Autowired
-    private ISysUserService userService;
+    private ISysUserService sysUserService;
 
     @Autowired
     private ISysConfigService configService;
+
+    @Autowired
+    private SsoBean ssoBean;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
 
     /**
      * 鐧诲綍楠岃瘉
@@ -176,6 +217,169 @@
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr());
         sysUser.setLoginDate(DateUtils.getNowDate());
-        userService.updateUserProfile(sysUser);
+        sysUserService.updateUserProfile(sysUser);
     }
+
+    /**
+     * 鍗曠偣鐧诲綍
+     * @param code
+     * @return
+     */
+    public String loginBySSO(String code) {
+
+        // 鑾峰彇鍗曠偣鐧诲綍token
+        SsoOauthTokenModel tokenModel = this.getSsoAccessToken(code);
+        if (tokenModel == null) {
+            throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+        }
+
+        // 鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅
+        SsoUserInfoModel userInfo = this.getSsoUserInfo(tokenModel.getAccess_token());
+        if (userInfo == null) {
+            throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+        }
+
+        // 鏌ヨ鏈湴鐢ㄦ埛淇℃伅
+        LoginUser loginUser = this.getSsoLoginToken(userInfo.getEmployeeId());
+        recordLoginInfo(loginUser.getUserId());
+
+        // 鍒涘缓鐧诲綍淇℃伅
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(userInfo.getEmployeeId(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+        redisTemplate.opsForValue().set("ssoOauthToken:idToken:" + userInfo.getEmployeeId(), tokenModel.getId_token(), 3, TimeUnit.DAYS);
+        // 鐢熸垚token
+        return tokenService.createToken(loginUser);
+    }
+
+    /**
+     * ***** 鑾峰彇鏈湴鐢ㄦ埛淇℃伅 *****
+     * @param username
+     * @return
+     */
+    public LoginUser getSsoLoginToken(String username) {
+        // 鐢ㄦ埛楠岃瘉
+        Authentication authentication = null;
+        SysUser sysUser = sysUserService.selectUserByUserName(username);
+        if (sysUser == null) {
+            throw new ServiceException("褰撳墠绯荤粺娌℃湁璇ョ敤鎴�");
+        }
+        try
+        {
+            // 鏃犻渶瀵嗙爜鑾峰彇鐢ㄦ埛淇℃伅
+            authentication = authenticationManager.authenticate(new SsoCodeAuthenticationToken(username));
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.sso.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        finally
+        {
+            AuthenticationContextHolder.clearContext();
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+        return (LoginUser) authentication.getPrincipal();
+
+    }
+
+
+    /**
+     * **** 鑾峰彇鍗曠偣鐧诲綍token ****
+     * @param code
+     * @return
+     */
+    public SsoOauthTokenModel getSsoAccessToken(String code) {
+        List<NameValuePair> list = new LinkedList<>();
+        list.add(new BasicNameValuePair("grant_type", "authorization_code"));
+        list.add(new BasicNameValuePair("code", code));
+        list.add(new BasicNameValuePair("client_id", ssoBean.getClientId()));
+        list.add(new BasicNameValuePair("client_secret", ssoBean.getClientSecret()));
+        list.add(new BasicNameValuePair("redirect_uri", ssoBean.getCallbackUrl()));
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/x-www-form-urlencoded");
+        headers.put("Accept", "application/json");
+        String result = doPost(ssoBean.getUrl() + "/oauth2/token", headers, list);
+        if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+            return null;
+        }
+        return JSON.parseObject(result, SsoOauthTokenModel.class);
+    }
+
+    /**
+     * ***鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅***
+     * @param accessToken
+     * @return
+     */
+    public SsoUserInfoModel getSsoUserInfo(String accessToken) {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", "Bearer " + accessToken);
+        String result = doPost(ssoBean.getUrl() + "/userinfo", headers, null);
+        if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+            return null;
+        }
+        return JSON.parseObject(result, SsoUserInfoModel.class);
+    }
+
+    public static String doPost(String url, Map<String, String> headers, List<NameValuePair> params) {
+        CloseableHttpClient client = createSSLClientDefault();
+        CloseableHttpResponse response = null;
+        try {
+            HttpPost method = new HttpPost(url);
+            headers.forEach(method::setHeader);
+            if (params != null) {
+                method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
+            }
+
+            response = client.execute(method);
+            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                HttpEntity entity = response.getEntity();
+                return EntityUtils.toString(entity);
+            }
+        } catch (Exception e) {
+            log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+        } finally {
+            try {
+                if (client != null) {
+                    client.close();
+                }
+                if (response != null) {
+                    response.close();
+                }
+            } catch (Exception e) {
+                log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+            }
+        }
+        return null;
+    }
+//
+//
+    private static CloseableHttpClient createSSLClientDefault() {
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                //淇′换鎵�鏈�
+                @Override
+                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        } catch (KeyManagementException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (KeyStoreException e) {
+            e.printStackTrace();
+        }
+        return HttpClients.createDefault();
+    }
+
 }

--
Gitblit v1.9.3