From b6dee87c91bfdcb68fcc456c9a2ec46b2ed7cbe3 Mon Sep 17 00:00:00 2001
From: dangsn <dangsn@chicecm.com>
Date: 星期二, 11 六月 2024 12:33:35 +0800
Subject: [PATCH] 登录和权限校验功能

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java |  139 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 125 insertions(+), 14 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
index 20a4a98..126723c 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
@@ -3,14 +3,20 @@
 import com.vci.corba.common.PLException;
 import com.vci.corba.omd.data.AttributeValue;
 import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.constant.TokenKeyConstant;
 import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.interceptor.VciSessionForLoginI;
 import com.vci.starter.web.pagemodel.SessionInfo;
-import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.pagemodel.TokenVO;
+import com.vci.starter.web.util.*;
+import com.vci.web.constant.CacheNameConstant;
 import com.vci.web.properties.WebProperties;
+import com.vci.web.redis.RedisService;
 import com.vci.web.service.WebBoServiceI;
 import com.vci.web.util.PlatformClientUtil;
 import com.vci.web.util.WebUtil;
+import io.jsonwebtoken.Claims;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +24,13 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 浼氳瘽瀛樺偍鐨勬湇鍔�
@@ -55,6 +63,12 @@
      */
     @Autowired
     private PlatformClientUtil platformClientUtil;
+
+    /**
+     * redis鏈嶅姟
+     */
+    @Resource
+    private RedisService redisService;
 
     /**
      * 妫�鏌ョ敤鎴锋槸鍚︾櫥褰�
@@ -137,11 +151,14 @@
     @Override
     public void updateRequestTime(String userToken) {
         WebUtil.alertNotNull(userToken,"浼氳瘽璁稿彲鐮�");
-        try{
-            platformClientUtil.getBOFactoryService().executeUpdateSql("update VCI_SESSIONINFO set lastRequestTime = " + String.valueOf(System.currentTimeMillis()) + " where TOKEN ='" + userToken.trim() + "'");
-        }catch (PLException e){
-            throw WebUtil.getVciBaseException(e);
+        //璇存槑鏄痡wt鐨則oken
+        String jwtToken = getSessionTokenKeyInRedis(userToken);
+        if(StringUtils.isBlank(jwtToken)){
+            jwtToken = userToken;
         }
+        SessionInfo sessionInfo = redisService.getCacheObject(jwtToken);
+        sessionInfo.setLastLoginTime(VciDateUtil.getNowTime());
+        redisService.setCacheObject(jwtToken, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
     }
 
     /**
@@ -153,16 +170,26 @@
     @Override
     public SessionInfo getSessionInfoByToken(String userToken) {
         WebUtil.alertNotNull(userToken,"璁稿彲鐨勪俊鎭�");
-        List<Map> dataList = boService.queryBySqlForMap("select JSONSTRING as JSONSTRING from VCI_SESSIONINFO where TOKEN ='" + userToken.trim() + "'", new HashMap<>());
-//        List<Map> dataList = null;
-//        Map map= new HashMap<>();
-//        map.put("JSONSTRING","{\"browser\":\"122.0.0.0\",\"deptName\":\"涓�杞﹂棿\",\"deptOid\":\"002151D0-13B9-DB23-7006-34DCAC76B3BE\",\"deviceInfo\":[],\"email\":\"\",\"functionOids\":[\"2339F262-1715-F5EE-7E50-4DD6A42B8668\",\"2EC65569-17C7-84C2-A7A6-737E1B021DC4\",\"32037B20-2F95-F4E8-6077-C0B5226B033D\",\"ADB513D3-397E-07DA-7456-992916FF12D9\",\"5D2FDBCA-E04D-B611-8311-8F06E031BF95\",\"56186AEE-80D7-2CDB-CB80-09E87CB9125F\",\"536FD86E-779E-397D-2945-69AAA942A578\",\"FDB26577-596F-CA6F-1A1F-7D68C0E0A3B9\",\"E612DAB4-B3EC-8D08-46CA-8905AC82EF2D\",\"893E5778-481C-A04E-2742-ADFDF0CE3A15\",\"297C9ED8-DF76-9D91-B041-45F1DE161FD8\",\"63A98B92-5DA8-3F23-390E-2A389C714BC1\",\"931C3199-3CA8-733B-1CF3-FE88F0258E16\",\"AC04E222-F14B-F4FF-11BB-DFE8917A2756\",\"64C6BFFD-95B2-995A-73FD-DEE8212DAA56\",\"CC5F364D-E299-81CF-0B20-4BF09956FDA3\",\"B5985BFB-F31D-05A1-9943-D43704F35EDB\",\"86BD9541-8F9B-395F-A73D-B856635EE91C\",\"72ACFF87-05B6-3D8F-4CC4-C559FE9AD372\",\"ECFA5263-AB30-78CB-6F5B-DF11BC054616\",\"88AC00BE-54CC-DE68-F31E-C3D9FAEDD902\",\"F2B19983-15EF-4DC8-0A26-AF322EC8B9D0\",\"D8C8AE63-AD0B-D567-BFBE-AE4BF302C241\",\"D0715569-0F88-5CAB-E9DB-2B93567FC610\",\"2C5FABD2-535F-8568-8E61-C643BA7D77A1\",\"E6E963E7-2DF6-80EE-2A61-FA86E0F3D5F2\",\"BDBD6CFA-2F4C-EEF7-C380-5E9BBF6A37B3\",\"7FE9306A-2659-4E62-1C2B-A09A600A1010\",\"B3EC1413-1A33-61E3-DDD1-CB4D0CFD0C6E\",\"23B65414-A7F9-21B4-A5A9-4F963B8C4ED9\",\"E1A8FA2E-6102-F4C6-209F-C589CD2149F2\",\"077A25D8-09D8-D5DE-42BC-A777BE3327D5\",\"0C8E0C13-A0C1-A4FC-F957-F595DA54E355\",\"BFB9E279-DD28-7172-4A52-2A1767AD7663\",\"CEEAE20E-D93E-2D04-13C6-B8BD5B336374\",\"E84E06C3-60AE-42B8-88BD-1BE52531C1FF\",\"CB5C52F0-5D84-0738-0DA6-0721B76AADB8\",\"C755CC24-7194-BAC4-A3C2-D79E1E3CC594\",\"D8084EB8-AAB0-75A8-7BDD-3DC075D1D919\",\"6C538322-CCFC-ABA2-3BC6-7048C9711ADF\",\"5CEEDD16-4467-2798-245F-57E63CFD7753\",\"A4853E63-0044-52F2-5420-E34B28387C9C\",\"8239D998-F8DF-10B0-24CF-4525FE03E760\",\"D0FCC667-4182-8F03-801E-22E11553B39E\",\"3CB2A1CD-83CA-C155-2675-7B7681E7B03F\",\"C15B77F2-7F7F-2385-BD1F-8A241FF7C1A3\",\"B98ABE87-00DA-4BCA-A3B3-3EB7DF9BE8D9\",\"D25A0998-D315-97F8-36DB-6951E981E54C\",\"2841A478-8E99-7A89-4879-309DFFE5DD61\",\"25C58C8A-D28B-DA99-97A3-F6544B4B8E8D\",\"2AA1BD3D-9318-431F-AB55-ECF4318BDC9F\",\"AC4084E2-06E3-FDD6-7F50-8C1E8090358C\",\"4B919471-E62F-F717-6AC8-DE2B10A2A1DC\",\"D38C457D-FC45-C068-5322-457E522651DC\",\"2DCB5CF2-8127-3826-CCAE-1C40C6746EE8\",\"21766DD3-0B62-C577-FB84-940C1B84711C\",\"ABF503E5-9741-C2BE-31B0-6E15AB50E2D6\",\"B203DE0A-EDD0-4295-1257-79A76917BE85\",\"65A88CCC-220E-3CBF-0D31-E0DF5BDD9C6F\",\"8B7DBACB-C18A-CA11-B0B8-3C481E76E30F\",\"45FB1520-F571-9E97-2EA3-B9C78AF89BEC\",\"E34E1E0D-55F8-3C19-8E7B-E42D8A3FEEB9\"],\"globalAttributeMap\":{},\"ip\":\"127.0.0.1\",\"mustChangePassword\":false,\"os\":\"Windows 10\",\"portalId\":\"1\",\"rolesName\":{\"44044800-B0EB-1003-55B5-954C3FFEA3B8\":\"EBOM瀵煎叆浜哄憳\",\"38FC5CC2-D880-A1C5-5DA0-C2F8B5082B52\":\"鏍″\",\"BA272199-5FF5-C513-F4FA-37F13A733FE8\":\"宸ヨ壓浜哄憳\",\"2761C8F4-6442-A53C-9F40-A1D5978E0799\":\"瀹℃牳\",\"DCF4961B-44DE-BA5B-F73C-8AA1EF1F1DB4\":\"gy1\",\"DA2608CC-07CB-A3FF-528B-CBE040BD7353\":\"缂栧埗\",\"A70A10D5-ED69-0CF5-8491-33D955569550\":\"浼氱\",\"CE4A351B-3669-9722-01AC-2E472B2900A5\":\"涓�鑸敤鎴穃",\"F5E11DDB-88E5-40F8-61B9-3F9E9ADAFFBF\":\"宸ヨ壓缁勯暱\",\"2DFA4811-B391-6727-33C6-697BF4E9A77D\":\"鎵瑰噯\",\"785F8459-DDEA-33D1-40D5-C3F6A42FABB1\":\"涓绘暟鎹甛",\"398B28CE-B1EE-FDEA-5B11-42908B8A3076\":\"PBOM绠$悊宀椾汉鍛榎"},\"sso\":false,\"token\":\"8b9f42164c6b7fd3ca532acf375626cd\",\"userId\":\"1\",\"userName\":\"娴嬭瘯\",\"userOid\":\"921D71F8-C2BB-3BCE-B744-AD0C3812F41A\",\"userSecret\":\"2\",\"usertype\":\"2\"}");
-        if(!CollectionUtils.isEmpty(dataList)) {
-            Map data = dataList.get(0);
-            SessionInfo sessionInfo = WebUtil.jsonString2JavaBean((String)data.getOrDefault("JSONSTRING",""),SessionInfo.class);
-            return  sessionInfo;
+        SessionInfo sessionInfo = null;
+        if(StringUtils.isNotBlank(userToken)){
+            if(userToken.startsWith(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS)){
+                sessionInfo = redisService.getCacheObject(userToken);
+                if(sessionInfo == null){
+                    throw new VciBaseException("token宸茶繃鏈燂紒");
+                }
+            }else{
+                //璇存槑鏄痡wt鐨則oken
+                String jwtToken = getSessionTokenKeyInRedis(userToken);
+                if(StringUtils.isBlank(jwtToken)){
+                    jwtToken = userToken;
+                }
+                sessionInfo = redisService.getCacheObject(jwtToken);
+                if(sessionInfo == null){
+                    throw new VciBaseException("token宸茶繃鏈燂紒");
+                }
+            }
         }
-        return null;
+        return sessionInfo;
     }
 
     /**
@@ -231,4 +258,88 @@
             }
         }
     }
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     *
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    @Override
+    public TokenVO createToken(SessionInfo sessionInfo) {
+        return createToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
+    }
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     * @param key token鍦╮edis涓殑key
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    @Override
+    public TokenVO createToken(String key, SessionInfo sessionInfo) {
+        if(StringUtils.isBlank(sessionInfo.getToken())) {
+            String token = Md5.md5(VciBaseUtil.getPk() + "_" + sessionInfo.getUserId());
+            sessionInfo.setToken(token);
+        }
+        if(StringUtils.isBlank(key)){
+            key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+        }
+        refreshToken(key, sessionInfo);
+        Map<String,Object> claimsMap = new HashMap<>();
+        claimsMap.put(TokenKeyConstant.JWT_TOKEN_KEY,sessionInfo.getToken());
+        claimsMap.put(TokenKeyConstant.JWT_USER_KEY,sessionInfo.getUserOid());
+        claimsMap.put(TokenKeyConstant.JWT_USER_NAME_KEY,sessionInfo.getUserName());
+        claimsMap.put(TokenKeyConstant.JWT_USER_CODE_KEY,sessionInfo.getUserId());
+        TokenVO tokenVO = new TokenVO();
+        tokenVO.setAccessToken(JwtUtils.createToken(claimsMap));
+        tokenVO.setExpireTime(TokenKeyConstant.EXPIRATION);
+        return tokenVO;
+    }
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    @Override
+    public void refreshToken(SessionInfo sessionInfo) {
+        refreshToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
+    }
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param key token鍦╮edis涓殑key
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    @Override
+    public void refreshToken(String key, SessionInfo sessionInfo) {
+        if(sessionInfo!=null && StringUtils.isNotBlank(sessionInfo.getToken())){
+            if(StringUtils.isBlank(key)){
+                key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+            }
+            String redisKey = key + sessionInfo.getToken();
+            redisService.setCacheObject(redisKey, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
+
+            //鍥犱负鍙兘闇�瑕侀��鍑虹櫥褰曪紝鎴栧悓涓�鐢ㄦ埛鍙兘鍦ㄧ嚎涓�涓紝鏁呴渶瑕佸瓨鍌紝鐢ㄦ埛鍜宩wtToken鐨勫叧绯�
+            String tokenKey = CacheNameConstant.cacheKey(CacheNameConstant.USERID_TOKEN_KEY,sessionInfo.getUserId());
+            redisService.setCacheObject(tokenKey, redisKey, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
+        }
+    }
+
+    /**
+     * jwt鐨則oken鏀规垚
+     * @param jwtToken jwt鐨勮鍙�
+     * @return 鍦╮edis閲岀殑淇℃伅
+     */
+    private String getSessionTokenKeyInRedis(String jwtToken) {
+        if(StringUtils.isBlank(jwtToken)){
+            return "";
+        }
+        String key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+        if(ControllerUtil.urlDecode(jwtToken).startsWith(key)){
+            return ControllerUtil.urlDecode(jwtToken);
+        }
+        String userToken = JwtUtils.getUserToken(jwtToken);
+        return TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS + userToken;
+    }
 }

--
Gitblit v1.9.3