From 5a97f4980320a82cd4f12e7f5b18d15492515c1e Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期三, 19 三月 2025 23:23:11 +0800
Subject: [PATCH] 修改装备配置文件

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java |  219 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 211 insertions(+), 8 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..bc666cb 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.NameValuePair;
+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.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -29,12 +51,24 @@
 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
  */
 @Component
+@Slf4j
 public class SysLoginService
 {
     @Autowired
@@ -45,16 +79,22 @@
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
-    private ISysUserService userService;
+    private ISysUserService sysUserService;
 
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private SsoBean ssoBean;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
     /**
      * 鐧诲綍楠岃瘉
-     * 
+     *
      * @param username 鐢ㄦ埛鍚�
      * @param password 瀵嗙爜
      * @param code 楠岃瘉鐮�
@@ -63,8 +103,8 @@
      */
     public String login(String username, String password, String code, String uuid)
     {
-        // 楠岃瘉鐮佹牎楠�
-        validateCaptcha(username, code, uuid);
+//        // 楠岃瘉鐮佹牎楠�
+//        validateCaptcha(username, code, uuid);
         // 鐧诲綍鍓嶇疆鏍¢獙
         loginPreCheck(username, password);
         // 鐢ㄦ埛楠岃瘉
@@ -102,7 +142,7 @@
 
     /**
      * 鏍¢獙楠岃瘉鐮�
-     * 
+     *
      * @param username 鐢ㄦ埛鍚�
      * @param code 楠岃瘉鐮�
      * @param uuid 鍞竴鏍囪瘑
@@ -176,6 +216,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