Преглед изворни кода

优化获取缓存信息方式

RuoYi пре 4 година
родитељ
комит
9c5c6c6be7
39 измењених фајлова са 628 додато и 105 уклоњено
  1. 16 0
      pom.xml
  2. 7 4
      ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
  3. 1 1
      ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
  4. 18 0
      ruoyi-common/ruoyi-common-core/pom.xml
  5. 10 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java
  6. 0 4
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
  7. 10 10
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
  8. 25 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/TokenConstants.java
  9. 88 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java
  10. 123 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
  11. 12 2
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
  12. 2 6
      ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java
  13. 1 1
      ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java
  14. 11 0
      ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
  15. 9 3
      ruoyi-common/ruoyi-common-security/pom.xml
  16. 44 2
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
  17. 35 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
  18. 33 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java
  19. 53 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
  20. 58 22
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
  21. 30 11
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SecurityUtils.java
  22. 1 0
      ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring.factories
  23. 22 19
      ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
  24. 1 1
      ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
  25. 1 1
      ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java
  26. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
  27. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
  28. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
  29. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
  30. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
  31. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
  32. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
  33. 4 5
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
  34. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
  35. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
  36. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
  37. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
  38. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
  39. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

+ 16 - 0
pom.xml

@@ -34,10 +34,12 @@
34 34
         <commons.fileupload.version>1.4</commons.fileupload.version>
35 35
         <velocity.version>1.7</velocity.version>
36 36
         <fastjson.version>1.2.78</fastjson.version>
37
+        <jjwt.version>0.9.1</jjwt.version>
37 38
         <minio.version>8.2.2</minio.version>
38 39
         <poi.version>4.1.2</poi.version>
39 40
         <common-pool.version>2.10.0</common-pool.version>
40 41
         <commons-collections.version>3.2.2</commons-collections.version>
42
+        <transmittable-thread-local.version>2.12.2</transmittable-thread-local.version>
41 43
     </properties>
42 44
 
43 45
     <!-- 依赖声明 -->
@@ -173,6 +175,20 @@
173 175
                 <version>${fastjson.version}</version>
174 176
             </dependency>
175 177
 
178
+            <!-- JWT -->
179
+            <dependency>
180
+                <groupId>io.jsonwebtoken</groupId>
181
+                <artifactId>jjwt</artifactId>
182
+                <version>${jjwt.version}</version>
183
+            </dependency>
184
+
185
+            <!-- 线程传递值 -->
186
+            <dependency>
187
+                <groupId>com.alibaba</groupId>
188
+                <artifactId>transmittable-thread-local</artifactId>
189
+                <version>${transmittable-thread-local.version}</version>
190
+            </dependency>
191
+
176 192
             <!-- 公共资源池 -->
177 193
             <dependency>
178 194
                 <groupId>org.apache.commons</groupId>

+ 7 - 4
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java

@@ -10,8 +10,11 @@ import com.ruoyi.auth.form.LoginBody;
10 10
 import com.ruoyi.auth.form.RegisterBody;
11 11
 import com.ruoyi.auth.service.SysLoginService;
12 12
 import com.ruoyi.common.core.domain.R;
13
+import com.ruoyi.common.core.utils.JwtUtils;
13 14
 import com.ruoyi.common.core.utils.StringUtils;
15
+import com.ruoyi.common.security.auth.AuthUtil;
14 16
 import com.ruoyi.common.security.service.TokenService;
17
+import com.ruoyi.common.security.utils.SecurityUtils;
15 18
 import com.ruoyi.system.api.model.LoginUser;
16 19
 
17 20
 /**
@@ -40,12 +43,12 @@ public class TokenController
40 43
     @DeleteMapping("logout")
41 44
     public R<?> logout(HttpServletRequest request)
42 45
     {
43
-        LoginUser loginUser = tokenService.getLoginUser(request);
44
-        if (StringUtils.isNotNull(loginUser))
46
+        String token = SecurityUtils.getToken(request);
47
+        if (StringUtils.isNotEmpty(token))
45 48
         {
46
-            String username = loginUser.getUsername();
49
+            String username = JwtUtils.getUserName(token);
47 50
             // 删除用户缓存记录
48
-            tokenService.delLoginUser(loginUser.getToken());
51
+            AuthUtil.logoutByToken(token);
49 52
             // 记录用户退出日志
50 53
             sysLoginService.logout(username);
51 54
         }

+ 1 - 1
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java

@@ -8,10 +8,10 @@ import com.ruoyi.common.core.constant.UserConstants;
8 8
 import com.ruoyi.common.core.domain.R;
9 9
 import com.ruoyi.common.core.enums.UserStatus;
10 10
 import com.ruoyi.common.core.exception.ServiceException;
11
-import com.ruoyi.common.core.utils.SecurityUtils;
12 11
 import com.ruoyi.common.core.utils.ServletUtils;
13 12
 import com.ruoyi.common.core.utils.StringUtils;
14 13
 import com.ruoyi.common.core.utils.ip.IpUtils;
14
+import com.ruoyi.common.security.utils.SecurityUtils;
15 15
 import com.ruoyi.system.api.RemoteLogService;
16 16
 import com.ruoyi.system.api.RemoteUserService;
17 17
 import com.ruoyi.system.api.domain.SysLogininfor;

+ 18 - 0
ruoyi-common/ruoyi-common-core/pom.xml

@@ -41,6 +41,12 @@
41 41
             <artifactId>spring-web</artifactId>
42 42
         </dependency>
43 43
 
44
+        <!-- Transmittable ThreadLocal -->
45
+        <dependency>
46
+            <groupId>com.alibaba</groupId>
47
+            <artifactId>transmittable-thread-local</artifactId>
48
+        </dependency>
49
+
44 50
         <!-- Apache Commons Pool2 -->
45 51
         <dependency>
46 52
             <groupId>org.apache.commons</groupId>
@@ -71,6 +77,18 @@
71 77
             <artifactId>fastjson</artifactId>
72 78
         </dependency>
73 79
 
80
+        <!-- Jwt -->
81
+        <dependency>
82
+            <groupId>io.jsonwebtoken</groupId>
83
+            <artifactId>jjwt</artifactId>
84
+        </dependency>
85
+
86
+        <!-- Jaxb -->
87
+        <dependency>
88
+            <groupId>javax.xml.bind</groupId>
89
+            <artifactId>jaxb-api</artifactId>
90
+        </dependency>
91
+
74 92
         <!-- Apache Lang3 -->
75 93
         <dependency>
76 94
             <groupId>org.apache.commons</groupId>

+ 10 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java

@@ -8,6 +8,16 @@ package com.ruoyi.common.core.constant;
8 8
 public class CacheConstants
9 9
 {
10 10
     /**
11
+     * 缓存有效期,默认720(分钟)
12
+     */
13
+    public final static long EXPIRATION = 720;
14
+
15
+    /**
16
+     * 缓存刷新时间,默认120(分钟)
17
+     */
18
+    public final static long REFRESH_TIME = 120;
19
+
20
+    /**
11 21
      * 权限缓存前缀
12 22
      */
13 23
     public final static String LOGIN_TOKEN_KEY = "login_tokens:";

+ 0 - 4
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java

@@ -97,10 +97,6 @@ public class Constants
97 97
      */
98 98
     public static final long CAPTCHA_EXPIRATION = 2;
99 99
 
100
-    /**
101
-     * 令牌有效期(分钟)
102
-     */
103
-    public final static long TOKEN_EXPIRE = 720;
104 100
 
105 101
     /**
106 102
      * 参数管理 cache key

+ 10 - 10
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java

@@ -8,16 +8,6 @@ package com.ruoyi.common.core.constant;
8 8
 public class SecurityConstants
9 9
 {
10 10
     /**
11
-     * 令牌自定义标识
12
-     */
13
-    public static final String TOKEN_AUTHENTICATION = "Authorization";
14
-
15
-    /**
16
-     * 令牌前缀
17
-     */
18
-    public static final String TOKEN_PREFIX = "Bearer ";
19
-
20
-    /**
21 11
      * 用户ID字段
22 12
      */
23 13
     public static final String DETAILS_USER_ID = "user_id";
@@ -41,4 +31,14 @@ public class SecurityConstants
41 31
      * 内部请求
42 32
      */
43 33
     public static final String INNER = "inner";
34
+
35
+    /**
36
+     * 用户标识
37
+     */
38
+    public static final String USER_KEY = "user_key";
39
+
40
+    /**
41
+     * 登录用户
42
+     */
43
+    public static final String LOGIN_USER = "login_user";
44 44
 }

+ 25 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/TokenConstants.java

@@ -0,0 +1,25 @@
1
+package com.ruoyi.common.core.constant;
2
+
3
+/**
4
+ * Token的Key常量
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class TokenConstants
9
+{
10
+    /**
11
+     * 令牌自定义标识
12
+     */
13
+    public static final String AUTHENTICATION = "Authorization";
14
+
15
+    /**
16
+     * 令牌前缀
17
+     */
18
+    public static final String PREFIX = "Bearer ";
19
+
20
+    /**
21
+     * 令牌秘钥
22
+     */
23
+    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
24
+
25
+}

+ 88 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java

@@ -0,0 +1,88 @@
1
+package com.ruoyi.common.core.context;
2
+
3
+import java.util.Map;
4
+import java.util.concurrent.ConcurrentHashMap;
5
+import com.alibaba.ttl.TransmittableThreadLocal;
6
+import com.ruoyi.common.core.constant.SecurityConstants;
7
+import com.ruoyi.common.core.text.Convert;
8
+import com.ruoyi.common.core.utils.StringUtils;
9
+
10
+/**
11
+ * 获取当前线程变量中的 用户id、用户名称、Token等信息 
12
+ * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
13
+ *
14
+ * @author ruoyi
15
+ */
16
+public class SecurityContextHolder
17
+{
18
+    private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
19
+
20
+    public static void set(String key, Object value)
21
+    {
22
+        Map<String, Object> map = getLocalMap();
23
+        map.put(key, value == null ? StringUtils.EMPTY : value);
24
+    }
25
+
26
+    public static String get(String key)
27
+    {
28
+        Map<String, Object> map = getLocalMap();
29
+        return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));
30
+    }
31
+
32
+    public static <T> T get(String key, Class<T> clazz)
33
+    {
34
+        Map<String, Object> map = getLocalMap();
35
+        return StringUtils.cast(map.getOrDefault(key, null));
36
+    }
37
+
38
+    public static Map<String, Object> getLocalMap()
39
+    {
40
+        Map<String, Object> map = THREAD_LOCAL.get();
41
+        if (map == null)
42
+        {
43
+            map = new ConcurrentHashMap<String, Object>();
44
+            THREAD_LOCAL.set(map);
45
+        }
46
+        return map;
47
+    }
48
+
49
+    public static void setLocalMap(Map<String, Object> threadLocalMap)
50
+    {
51
+        THREAD_LOCAL.set(threadLocalMap);
52
+    }
53
+
54
+    public static Long getUserId()
55
+    {
56
+        return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L);
57
+    }
58
+
59
+    public static void setUserId(String account)
60
+    {
61
+        set(SecurityConstants.DETAILS_USER_ID, account);
62
+    }
63
+
64
+    public static String getUserName()
65
+    {
66
+        return get(SecurityConstants.DETAILS_USERNAME);
67
+    }
68
+
69
+    public static void setUserName(String username)
70
+    {
71
+        set(SecurityConstants.DETAILS_USERNAME, username);
72
+    }
73
+
74
+    public static String getUserKey()
75
+    {
76
+        return get(SecurityConstants.USER_KEY);
77
+    }
78
+
79
+    public static void setUserKey(String userKey)
80
+    {
81
+        set(SecurityConstants.USER_KEY, userKey);
82
+    }
83
+
84
+    public static void remove()
85
+    {
86
+        THREAD_LOCAL.remove();
87
+    }
88
+}

+ 123 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java

@@ -0,0 +1,123 @@
1
+package com.ruoyi.common.core.utils;
2
+
3
+import java.util.Map;
4
+import com.ruoyi.common.core.constant.SecurityConstants;
5
+import com.ruoyi.common.core.constant.TokenConstants;
6
+import com.ruoyi.common.core.text.Convert;
7
+import io.jsonwebtoken.Claims;
8
+import io.jsonwebtoken.Jwts;
9
+import io.jsonwebtoken.SignatureAlgorithm;
10
+
11
+/**
12
+ * Jwt工具类
13
+ *
14
+ * @author ruoyi
15
+ */
16
+public class JwtUtils
17
+{
18
+    public static String secret = TokenConstants.SECRET;
19
+
20
+    /**
21
+     * 从数据声明生成令牌
22
+     *
23
+     * @param claims 数据声明
24
+     * @return 令牌
25
+     */
26
+    public static String createToken(Map<String, Object> claims)
27
+    {
28
+        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
29
+        return token;
30
+    }
31
+
32
+    /**
33
+     * 从令牌中获取数据声明
34
+     *
35
+     * @param token 令牌
36
+     * @return 数据声明
37
+     */
38
+    public static Claims parseToken(String token)
39
+    {
40
+        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
41
+    }
42
+
43
+    /**
44
+     * 根据令牌获取用户标识
45
+     * 
46
+     * @param token 令牌
47
+     * @return 用户ID
48
+     */
49
+    public static String getUserKey(String token)
50
+    {
51
+        Claims claims = parseToken(token);
52
+        return getValue(claims, SecurityConstants.USER_KEY);
53
+    }
54
+
55
+    /**
56
+     * 根据令牌获取用户标识
57
+     * 
58
+     * @param claims 身份信息
59
+     * @return 用户ID
60
+     */
61
+    public static String getUserKey(Claims claims)
62
+    {
63
+        return getValue(claims, SecurityConstants.USER_KEY);
64
+    }
65
+
66
+    /**
67
+     * 根据令牌获取用户ID
68
+     * 
69
+     * @param token 令牌
70
+     * @return 用户ID
71
+     */
72
+    public static String getUserId(String token)
73
+    {
74
+        Claims claims = parseToken(token);
75
+        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
76
+    }
77
+
78
+    /**
79
+     * 根据身份信息获取用户ID
80
+     * 
81
+     * @param claims 身份信息
82
+     * @return 用户ID
83
+     */
84
+    public static String getUserId(Claims claims)
85
+    {
86
+        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
87
+    }
88
+
89
+    /**
90
+     * 根据令牌获取用户名
91
+     * 
92
+     * @param token 令牌
93
+     * @return 用户名
94
+     */
95
+    public static String getUserName(String token)
96
+    {
97
+        Claims claims = parseToken(token);
98
+        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
99
+    }
100
+
101
+    /**
102
+     * 根据身份信息获取用户名
103
+     * 
104
+     * @param claims 身份信息
105
+     * @return 用户名
106
+     */
107
+    public static String getUserName(Claims claims)
108
+    {
109
+        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
110
+    }
111
+
112
+    /**
113
+     * 根据身份信息获取键值
114
+     * 
115
+     * @param claims 身份信息
116
+     * @param key 键
117
+     * @return 值
118
+     */
119
+    public static String getValue(Claims claims, String key)
120
+    {
121
+        return Convert.toStr(claims.get(key), "");
122
+    }
123
+}

+ 12 - 2
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java

@@ -130,6 +130,16 @@ public class ServletUtils
130 130
         }
131 131
     }
132 132
 
133
+    public static String getHeader(HttpServletRequest request, String name)
134
+    {
135
+        String value = request.getHeader(name);
136
+        if (StringUtils.isEmpty(value))
137
+        {
138
+            return StringUtils.EMPTY;
139
+        }
140
+        return urlDecode(value);
141
+    }
142
+
133 143
     public static Map<String, String> getHeaders(HttpServletRequest request)
134 144
     {
135 145
         Map<String, String> map = new LinkedHashMap<>();
@@ -216,7 +226,7 @@ public class ServletUtils
216 226
         }
217 227
         catch (UnsupportedEncodingException e)
218 228
         {
219
-            return "";
229
+            return StringUtils.EMPTY;
220 230
         }
221 231
     }
222 232
 
@@ -234,7 +244,7 @@ public class ServletUtils
234 244
         }
235 245
         catch (UnsupportedEncodingException e)
236 246
         {
237
-            return "";
247
+            return StringUtils.EMPTY;
238 248
         }
239 249
     }
240 250
 

+ 2 - 6
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java

@@ -3,12 +3,11 @@ package com.ruoyi.common.datascope.aspect;
3 3
 import org.aspectj.lang.JoinPoint;
4 4
 import org.aspectj.lang.annotation.Aspect;
5 5
 import org.aspectj.lang.annotation.Before;
6
-import org.springframework.beans.factory.annotation.Autowired;
7 6
 import org.springframework.stereotype.Component;
8 7
 import com.ruoyi.common.core.utils.StringUtils;
9 8
 import com.ruoyi.common.core.web.domain.BaseEntity;
10 9
 import com.ruoyi.common.datascope.annotation.DataScope;
11
-import com.ruoyi.common.security.service.TokenService;
10
+import com.ruoyi.common.security.utils.SecurityUtils;
12 11
 import com.ruoyi.system.api.domain.SysRole;
13 12
 import com.ruoyi.system.api.domain.SysUser;
14 13
 import com.ruoyi.system.api.model.LoginUser;
@@ -52,9 +51,6 @@ public class DataScopeAspect
52 51
      */
53 52
     public static final String DATA_SCOPE = "dataScope";
54 53
 
55
-    @Autowired
56
-    private TokenService tokenService;
57
-
58 54
     @Before("@annotation(controllerDataScope)")
59 55
     public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
60 56
     {
@@ -65,7 +61,7 @@ public class DataScopeAspect
65 61
     protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope)
66 62
     {
67 63
         // 获取当前的用户
68
-        LoginUser loginUser = tokenService.getLoginUser();
64
+        LoginUser loginUser = SecurityUtils.getLoginUser();
69 65
         if (StringUtils.isNotNull(loginUser))
70 66
         {
71 67
             SysUser currentUser = loginUser.getSysUser();

+ 1 - 1
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java

@@ -16,13 +16,13 @@ import org.springframework.stereotype.Component;
16 16
 import org.springframework.validation.BindingResult;
17 17
 import org.springframework.web.multipart.MultipartFile;
18 18
 import com.alibaba.fastjson.JSON;
19
-import com.ruoyi.common.core.utils.SecurityUtils;
20 19
 import com.ruoyi.common.core.utils.ServletUtils;
21 20
 import com.ruoyi.common.core.utils.StringUtils;
22 21
 import com.ruoyi.common.core.utils.ip.IpUtils;
23 22
 import com.ruoyi.common.log.annotation.Log;
24 23
 import com.ruoyi.common.log.enums.BusinessStatus;
25 24
 import com.ruoyi.common.log.service.AsyncLogService;
25
+import com.ruoyi.common.security.utils.SecurityUtils;
26 26
 import com.ruoyi.system.api.domain.SysOperLog;
27 27
 
28 28
 /**

+ 11 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java

@@ -75,6 +75,17 @@ public class RedisService
75 75
     }
76 76
 
77 77
     /**
78
+     * 获取有效时间
79
+     *
80
+     * @param key Redis键
81
+     * @return 有效时间
82
+     */
83
+    public long getExpire(final String key)
84
+    {
85
+        return redisTemplate.getExpire(key);
86
+    }
87
+
88
+    /**
78 89
      * 判断 key是否存在
79 90
      *
80 91
      * @param key 键

+ 9 - 3
ruoyi-common/ruoyi-common-security/pom.xml

@@ -15,19 +15,25 @@
15 15
     </description>
16 16
 
17 17
     <dependencies>
18
-    
18
+
19
+        <!-- Spring Web -->
20
+        <dependency>
21
+            <groupId>org.springframework</groupId>
22
+            <artifactId>spring-webmvc</artifactId>
23
+        </dependency>
24
+
19 25
         <!-- RuoYi Api System -->
20 26
         <dependency>
21 27
             <groupId>com.ruoyi</groupId>
22 28
             <artifactId>ruoyi-api-system</artifactId>
23 29
         </dependency>
24
-        
30
+
25 31
         <!-- RuoYi Common Redis-->
26 32
         <dependency>
27 33
             <groupId>com.ruoyi</groupId>
28 34
             <artifactId>ruoyi-common-redis</artifactId>
29 35
         </dependency>
30
-        
36
+
31 37
     </dependencies>
32 38
 
33 39
 </project>

+ 44 - 2
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java

@@ -7,7 +7,6 @@ import org.springframework.util.PatternMatchUtils;
7 7
 import com.ruoyi.common.core.exception.auth.NotLoginException;
8 8
 import com.ruoyi.common.core.exception.auth.NotPermissionException;
9 9
 import com.ruoyi.common.core.exception.auth.NotRoleException;
10
-import com.ruoyi.common.core.utils.SecurityUtils;
11 10
 import com.ruoyi.common.core.utils.SpringUtils;
12 11
 import com.ruoyi.common.core.utils.StringUtils;
13 12
 import com.ruoyi.common.security.annotation.Logical;
@@ -15,6 +14,7 @@ import com.ruoyi.common.security.annotation.RequiresLogin;
15 14
 import com.ruoyi.common.security.annotation.RequiresPermissions;
16 15
 import com.ruoyi.common.security.annotation.RequiresRoles;
17 16
 import com.ruoyi.common.security.service.TokenService;
17
+import com.ruoyi.common.security.utils.SecurityUtils;
18 18
 import com.ruoyi.system.api.model.LoginUser;
19 19
 
20 20
 /**
@@ -33,6 +33,27 @@ public class AuthLogic
33 33
     public TokenService tokenService = SpringUtils.getBean(TokenService.class);
34 34
 
35 35
     /**
36
+     * 会话注销
37
+     */
38
+    public void logout()
39
+    {
40
+        String token = SecurityUtils.getToken();
41
+        if (token == null)
42
+        {
43
+            return;
44
+        }
45
+        logoutByToken(token);
46
+    }
47
+
48
+    /**
49
+     * 会话注销,根据指定Token
50
+     */
51
+    public void logoutByToken(String token)
52
+    {
53
+        tokenService.delLoginUser(token);
54
+    }
55
+
56
+    /**
36 57
      * 检验用户是否已经登录,如未登录,则抛出异常
37 58
      */
38 59
     public void checkLogin()
@@ -52,7 +73,7 @@ public class AuthLogic
52 73
         {
53 74
             throw new NotLoginException("未提供token");
54 75
         }
55
-        LoginUser loginUser = tokenService.getLoginUser(token);
76
+        LoginUser loginUser = SecurityUtils.getLoginUser();
56 77
         if (loginUser == null)
57 78
         {
58 79
             throw new NotLoginException("无效的token");
@@ -61,6 +82,27 @@ public class AuthLogic
61 82
     }
62 83
 
63 84
     /**
85
+     * 获取当前用户缓存信息, 如果未登录,则抛出异常
86
+     * 
87
+     * @param token 前端传递的认证信息
88
+     * @return 用户缓存信息
89
+     */
90
+    public LoginUser getLoginUser(String token)
91
+    {
92
+        return tokenService.getLoginUser(token);
93
+    }
94
+
95
+    /**
96
+     * 验证当前用户有效期, 如果相差不足360分钟,自动刷新缓存
97
+     * 
98
+     * @param loginUser 当前用户信息
99
+     */
100
+    public void verifyLoginUserExpire(LoginUser loginUser)
101
+    {
102
+        tokenService.verifyToken(loginUser);
103
+    }
104
+
105
+    /**
64 106
      * 验证用户是否具备某权限
65 107
      * 
66 108
      * @param permission 权限字符串

+ 35 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java

@@ -2,6 +2,7 @@ package com.ruoyi.common.security.auth;
2 2
 
3 3
 import com.ruoyi.common.security.annotation.RequiresPermissions;
4 4
 import com.ruoyi.common.security.annotation.RequiresRoles;
5
+import com.ruoyi.system.api.model.LoginUser;
5 6
 
6 7
 /**
7 8
  * Token 权限验证工具类
@@ -16,6 +17,24 @@ public class AuthUtil
16 17
     public static AuthLogic authLogic = new AuthLogic();
17 18
 
18 19
     /**
20
+     * 会话注销
21
+     */
22
+    public static void logout()
23
+    {
24
+        authLogic.logout();
25
+    }
26
+
27
+    /**
28
+     * 会话注销,根据指定Token
29
+     * 
30
+     * @param tokenValue 指定token
31
+     */
32
+    public static void logoutByToken(String token)
33
+    {
34
+        authLogic.logoutByToken(token);
35
+    }
36
+
37
+    /**
19 38
      * 检验当前会话是否已经登录,如未登录,则抛出异常
20 39
      */
21 40
     public static void checkLogin()
@@ -24,6 +43,22 @@ public class AuthUtil
24 43
     }
25 44
 
26 45
     /**
46
+     * 获取当前登录用户信息
47
+     */
48
+    public static LoginUser getLoginUser(String token)
49
+    {
50
+        return authLogic.getLoginUser(token);
51
+    }
52
+
53
+    /**
54
+     * 验证当前用户有效期
55
+     */
56
+    public static void verifyLoginUserExpire(LoginUser loginUser)
57
+    {
58
+        authLogic.verifyLoginUserExpire(loginUser);
59
+    }
60
+
61
+    /**
27 62
      * 当前账号是否含有指定角色标识, 返回true或false
28 63
      * 
29 64
      * @param role 角色标识

+ 33 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java

@@ -0,0 +1,33 @@
1
+package com.ruoyi.common.security.config;
2
+
3
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
4
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
5
+import com.ruoyi.common.security.interceptor.HeaderInterceptor;
6
+
7
+/**
8
+ * 拦截器配置
9
+ *
10
+ * @author ruoyi
11
+ */
12
+public class WebMvcConfig implements WebMvcConfigurer
13
+{
14
+    /** 不需要拦截地址 */
15
+    public static final String[] excludeUrls = { "/login", "/logout", "/refresh" };
16
+
17
+    @Override
18
+    public void addInterceptors(InterceptorRegistry registry)
19
+    {
20
+        registry.addInterceptor(getHeaderInterceptor())
21
+                .addPathPatterns("/**")
22
+                .excludePathPatterns(excludeUrls)
23
+                .order(-10);
24
+    }
25
+
26
+    /**
27
+     * 自定义请求头拦截器
28
+     */
29
+    public HeaderInterceptor getHeaderInterceptor()
30
+    {
31
+        return new HeaderInterceptor();
32
+    }
33
+}

+ 53 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java

@@ -0,0 +1,53 @@
1
+package com.ruoyi.common.security.interceptor;
2
+
3
+import javax.servlet.http.HttpServletRequest;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.web.method.HandlerMethod;
6
+import org.springframework.web.servlet.AsyncHandlerInterceptor;
7
+import com.ruoyi.common.core.constant.SecurityConstants;
8
+import com.ruoyi.common.core.context.SecurityContextHolder;
9
+import com.ruoyi.common.core.utils.ServletUtils;
10
+import com.ruoyi.common.core.utils.StringUtils;
11
+import com.ruoyi.common.security.auth.AuthUtil;
12
+import com.ruoyi.common.security.utils.SecurityUtils;
13
+import com.ruoyi.system.api.model.LoginUser;
14
+
15
+/**
16
+ * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取
17
+ *
18
+ * @author ruoyi
19
+ */
20
+public class HeaderInterceptor implements AsyncHandlerInterceptor
21
+{
22
+    @Override
23
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
24
+    {
25
+        if (!(handler instanceof HandlerMethod))
26
+        {
27
+            return true;
28
+        }
29
+
30
+        SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
31
+        SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
32
+        SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
33
+
34
+        String token = SecurityUtils.getToken();
35
+        if (StringUtils.isNotEmpty(token))
36
+        {
37
+            LoginUser loginUser = AuthUtil.getLoginUser(token);
38
+            if (StringUtils.isNotNull(loginUser))
39
+            {
40
+                AuthUtil.verifyLoginUserExpire(loginUser);
41
+                SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser);
42
+            }
43
+        }
44
+        return true;
45
+    }
46
+
47
+    @Override
48
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
49
+            throws Exception
50
+    {
51
+        SecurityContextHolder.remove();
52
+    }
53
+}

+ 58 - 22
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java

@@ -7,13 +7,14 @@ import javax.servlet.http.HttpServletRequest;
7 7
 import org.springframework.beans.factory.annotation.Autowired;
8 8
 import org.springframework.stereotype.Component;
9 9
 import com.ruoyi.common.core.constant.CacheConstants;
10
-import com.ruoyi.common.core.constant.Constants;
10
+import com.ruoyi.common.core.constant.SecurityConstants;
11 11
 import com.ruoyi.common.core.utils.IdUtils;
12
-import com.ruoyi.common.core.utils.SecurityUtils;
12
+import com.ruoyi.common.core.utils.JwtUtils;
13 13
 import com.ruoyi.common.core.utils.ServletUtils;
14 14
 import com.ruoyi.common.core.utils.StringUtils;
15 15
 import com.ruoyi.common.core.utils.ip.IpUtils;
16 16
 import com.ruoyi.common.redis.service.RedisService;
17
+import com.ruoyi.common.security.utils.SecurityUtils;
17 18
 import com.ruoyi.system.api.model.LoginUser;
18 19
 
19 20
 /**
@@ -27,31 +28,41 @@ public class TokenService
27 28
     @Autowired
28 29
     private RedisService redisService;
29 30
 
30
-    private final static long EXPIRE_TIME = Constants.TOKEN_EXPIRE * 60;
31
+    protected static final long MILLIS_SECOND = 1000;
32
+
33
+    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
34
+
35
+    private final static long expireTime = CacheConstants.EXPIRATION;
31 36
 
32 37
     private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY;
33 38
 
34
-    protected static final long MILLIS_SECOND = 1000;
39
+    private final static Long MILLIS_MINUTE_TEN = CacheConstants.REFRESH_TIME * MILLIS_MINUTE;
35 40
 
36 41
     /**
37 42
      * 创建令牌
38 43
      */
39 44
     public Map<String, Object> createToken(LoginUser loginUser)
40 45
     {
41
-        // 生成token
42 46
         String token = IdUtils.fastUUID();
47
+        Long userId = loginUser.getSysUser().getUserId();
48
+        String userName = loginUser.getSysUser().getUserName();
43 49
         loginUser.setToken(token);
44
-        loginUser.setUserid(loginUser.getSysUser().getUserId());
45
-        loginUser.setUsername(loginUser.getSysUser().getUserName());
50
+        loginUser.setUserid(userId);
51
+        loginUser.setUsername(userName);
46 52
         loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
47 53
         refreshToken(loginUser);
48 54
 
49
-        // 保存或更新用户token
50
-        Map<String, Object> map = new HashMap<String, Object>();
51
-        map.put("access_token", token);
52
-        map.put("expires_in", EXPIRE_TIME);
53
-        redisService.setCacheObject(ACCESS_TOKEN + token, loginUser, EXPIRE_TIME, TimeUnit.SECONDS);
54
-        return map;
55
+        // Jwt存储信息
56
+        Map<String, Object> claimsMap = new HashMap<String, Object>();
57
+        claimsMap.put(SecurityConstants.USER_KEY, token);
58
+        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
59
+        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
60
+
61
+        // 接口返回信息
62
+        Map<String, Object> rspMap = new HashMap<String, Object>();
63
+        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
64
+        rspMap.put("expires_in", expireTime);
65
+        return rspMap;
55 66
     }
56 67
 
57 68
     /**
@@ -83,13 +94,20 @@ public class TokenService
83 94
      */
84 95
     public LoginUser getLoginUser(String token)
85 96
     {
86
-        if (StringUtils.isNotEmpty(token))
97
+        LoginUser user = null;
98
+        try
99
+        {
100
+            if (StringUtils.isNotEmpty(token))
101
+            {
102
+                String userkey = JwtUtils.getUserKey(token);
103
+                user = redisService.getCacheObject(getTokenKey(userkey));
104
+                return user;
105
+            }
106
+        }
107
+        catch (Exception e)
87 108
         {
88
-            String userKey = getTokenKey(token);
89
-            LoginUser user = redisService.getCacheObject(userKey);
90
-            return user;
91 109
         }
92
-        return null;
110
+        return user;
93 111
     }
94 112
 
95 113
     /**
@@ -103,12 +121,30 @@ public class TokenService
103 121
         }
104 122
     }
105 123
 
124
+    /**
125
+     * 删除用户缓存信息
126
+     */
106 127
     public void delLoginUser(String token)
107 128
     {
108 129
         if (StringUtils.isNotEmpty(token))
109 130
         {
110
-            String userKey = getTokenKey(token);
111
-            redisService.deleteObject(userKey);
131
+            String userkey = JwtUtils.getUserKey(token);
132
+            redisService.deleteObject(getTokenKey(userkey));
133
+        }
134
+    }
135
+
136
+    /**
137
+     * 验证令牌有效期,相差不足120分钟,自动刷新缓存
138
+     *
139
+     * @param loginUser
140
+     */
141
+    public void verifyToken(LoginUser loginUser)
142
+    {
143
+        long expireTime = loginUser.getExpireTime();
144
+        long currentTime = System.currentTimeMillis();
145
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
146
+        {
147
+            refreshToken(loginUser);
112 148
         }
113 149
     }
114 150
 
@@ -120,10 +156,10 @@ public class TokenService
120 156
     public void refreshToken(LoginUser loginUser)
121 157
     {
122 158
         loginUser.setLoginTime(System.currentTimeMillis());
123
-        loginUser.setExpireTime(loginUser.getLoginTime() + EXPIRE_TIME * MILLIS_SECOND);
159
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
124 160
         // 根据uuid将loginUser缓存
125 161
         String userKey = getTokenKey(loginUser.getToken());
126
-        redisService.setCacheObject(userKey, loginUser, EXPIRE_TIME, TimeUnit.SECONDS);
162
+        redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
127 163
     }
128 164
 
129 165
     private String getTokenKey(String token)

+ 30 - 11
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SecurityUtils.java

@@ -1,9 +1,13 @@
1
-package com.ruoyi.common.core.utils;
1
+package com.ruoyi.common.security.utils;
2 2
 
3 3
 import javax.servlet.http.HttpServletRequest;
4 4
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
5 5
 import com.ruoyi.common.core.constant.SecurityConstants;
6
-import com.ruoyi.common.core.text.Convert;
6
+import com.ruoyi.common.core.constant.TokenConstants;
7
+import com.ruoyi.common.core.context.SecurityContextHolder;
8
+import com.ruoyi.common.core.utils.ServletUtils;
9
+import com.ruoyi.common.core.utils.StringUtils;
10
+import com.ruoyi.system.api.model.LoginUser;
7 11
 
8 12
 /**
9 13
  * 权限获取工具类
@@ -13,20 +17,35 @@ import com.ruoyi.common.core.text.Convert;
13 17
 public class SecurityUtils
14 18
 {
15 19
     /**
16
-     * 获取用户
20
+     * 获取用户ID
21
+     */
22
+    public static Long getUserId()
23
+    {
24
+        return SecurityContextHolder.getUserId();
25
+    }
26
+
27
+    /**
28
+     * 获取用户名称
17 29
      */
18 30
     public static String getUsername()
19 31
     {
20
-        String username = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USERNAME);
21
-        return ServletUtils.urlDecode(username);
32
+        return SecurityContextHolder.getUserName();
22 33
     }
23 34
 
24 35
     /**
25
-     * 获取用户ID
36
+     * 获取用户key
26 37
      */
27
-    public static Long getUserId()
38
+    public static String getUserKey()
39
+    {
40
+        return SecurityContextHolder.getUserKey();
41
+    }
42
+
43
+    /**
44
+     * 获取登录用户信息
45
+     */
46
+    public static LoginUser getLoginUser()
28 47
     {
29
-        return Convert.toLong(ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USER_ID));
48
+        return SecurityContextHolder.get(SecurityConstants.LOGIN_USER, LoginUser.class);
30 49
     }
31 50
 
32 51
     /**
@@ -43,7 +62,7 @@ public class SecurityUtils
43 62
     public static String getToken(HttpServletRequest request)
44 63
     {
45 64
         // 从header获取token标识
46
-        String token = request.getHeader(SecurityConstants.TOKEN_AUTHENTICATION);
65
+        String token = request.getHeader(TokenConstants.AUTHENTICATION);
47 66
         return replaceTokenPrefix(token);
48 67
     }
49 68
 
@@ -53,9 +72,9 @@ public class SecurityUtils
53 72
     public static String replaceTokenPrefix(String token)
54 73
     {
55 74
         // 如果前端设置了令牌前缀,则裁剪掉前缀
56
-        if (StringUtils.isNotEmpty(token) && token.startsWith(SecurityConstants.TOKEN_PREFIX))
75
+        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
57 76
         {
58
-            token = token.replaceFirst(SecurityConstants.TOKEN_PREFIX, "");
77
+            token = token.replaceFirst(TokenConstants.PREFIX, "");
59 78
         }
60 79
         return token;
61 80
     }

+ 1 - 0
ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring.factories

@@ -1,4 +1,5 @@
1 1
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2
+  com.ruoyi.common.security.config.WebMvcConfig,\
2 3
   com.ruoyi.common.security.service.TokenService,\
3 4
   com.ruoyi.common.security.aspect.PreAuthorizeAspect,\
4 5
   com.ruoyi.common.security.aspect.InnerAuthAspect,\

+ 22 - 19
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java

@@ -1,26 +1,24 @@
1 1
 package com.ruoyi.gateway.filter;
2 2
 
3
-import javax.annotation.Resource;
4 3
 import org.slf4j.Logger;
5 4
 import org.slf4j.LoggerFactory;
6 5
 import org.springframework.beans.factory.annotation.Autowired;
7 6
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
8 7
 import org.springframework.cloud.gateway.filter.GlobalFilter;
9 8
 import org.springframework.core.Ordered;
10
-import org.springframework.data.redis.core.ValueOperations;
11 9
 import org.springframework.http.server.reactive.ServerHttpRequest;
12 10
 import org.springframework.stereotype.Component;
13 11
 import org.springframework.web.server.ServerWebExchange;
14
-import com.alibaba.fastjson.JSONObject;
15 12
 import com.ruoyi.common.core.constant.CacheConstants;
16
-import com.ruoyi.common.core.constant.Constants;
17 13
 import com.ruoyi.common.core.constant.HttpStatus;
18 14
 import com.ruoyi.common.core.constant.SecurityConstants;
19
-import com.ruoyi.common.core.utils.SecurityUtils;
15
+import com.ruoyi.common.core.constant.TokenConstants;
16
+import com.ruoyi.common.core.utils.JwtUtils;
20 17
 import com.ruoyi.common.core.utils.ServletUtils;
21 18
 import com.ruoyi.common.core.utils.StringUtils;
22 19
 import com.ruoyi.common.redis.service.RedisService;
23 20
 import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
21
+import io.jsonwebtoken.Claims;
24 22
 import reactor.core.publisher.Mono;
25 23
 
26 24
 /**
@@ -33,18 +31,14 @@ public class AuthFilter implements GlobalFilter, Ordered
33 31
 {
34 32
     private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
35 33
 
36
-    private final static long EXPIRE_TIME = Constants.TOKEN_EXPIRE * 60;
37
-
38 34
     // 排除过滤的 uri 地址,nacos自行添加
39 35
     @Autowired
40 36
     private IgnoreWhiteProperties ignoreWhite;
41 37
 
42
-    @Resource(name = "stringRedisTemplate")
43
-    private ValueOperations<String, String> sops;
44
-
45 38
     @Autowired
46 39
     private RedisService redisService;
47 40
 
41
+
48 42
     @Override
49 43
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
50 44
     {
@@ -62,22 +56,26 @@ public class AuthFilter implements GlobalFilter, Ordered
62 56
         {
63 57
             return unauthorizedResponse(exchange, "令牌不能为空");
64 58
         }
65
-        String userStr = sops.get(getTokenKey(token));
66
-        if (StringUtils.isEmpty(userStr))
59
+        Claims claims = JwtUtils.parseToken(token);
60
+        if (claims == null)
61
+        {
62
+            return unauthorizedResponse(exchange, "token已过期或验证不正确!");
63
+        }
64
+        String userkey = JwtUtils.getUserKey(claims);
65
+        boolean islogin = redisService.hasKey(getTokenKey(userkey));
66
+        if (!islogin)
67 67
         {
68 68
             return unauthorizedResponse(exchange, "登录状态已过期");
69 69
         }
70
-        JSONObject cacheObj = JSONObject.parseObject(userStr);
71
-        String userid = cacheObj.getString("userid");
72
-        String username = cacheObj.getString("username");
70
+        String userid = JwtUtils.getUserId(claims);
71
+        String username = JwtUtils.getUserName(claims);
73 72
         if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
74 73
         {
75 74
             return unauthorizedResponse(exchange, "令牌验证失败");
76 75
         }
77 76
 
78
-        // 设置过期时间
79
-        redisService.expire(getTokenKey(token), EXPIRE_TIME);
80 77
         // 设置用户信息到请求
78
+        addHeader(mutate, SecurityConstants.USER_KEY, userkey);
81 79
         addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
82 80
         addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
83 81
         // 内部请求来源参数清除
@@ -120,8 +118,13 @@ public class AuthFilter implements GlobalFilter, Ordered
120 118
      */
121 119
     private String getToken(ServerHttpRequest request)
122 120
     {
123
-        String token = request.getHeaders().getFirst(SecurityConstants.TOKEN_AUTHENTICATION);
124
-        return SecurityUtils.replaceTokenPrefix(token);
121
+        String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
122
+        // 如果前端设置了令牌前缀,则裁剪掉前缀
123
+        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
124
+        {
125
+            token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
126
+        }
127
+        return token;
125 128
     }
126 129
 
127 130
     @Override

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java

@@ -26,8 +26,8 @@ import com.ruoyi.common.core.constant.Constants;
26 26
 import com.ruoyi.common.core.constant.GenConstants;
27 27
 import com.ruoyi.common.core.exception.ServiceException;
28 28
 import com.ruoyi.common.core.text.CharsetKit;
29
-import com.ruoyi.common.core.utils.SecurityUtils;
30 29
 import com.ruoyi.common.core.utils.StringUtils;
30
+import com.ruoyi.common.security.utils.SecurityUtils;
31 31
 import com.ruoyi.gen.domain.GenTable;
32 32
 import com.ruoyi.gen.domain.GenTableColumn;
33 33
 import com.ruoyi.gen.mapper.GenTableColumnMapper;

+ 1 - 1
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java

@@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.Constants;
17 17
 import com.ruoyi.common.core.exception.job.TaskException;
18
-import com.ruoyi.common.core.utils.SecurityUtils;
19 18
 import com.ruoyi.common.core.utils.StringUtils;
20 19
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
21 20
 import com.ruoyi.common.core.web.controller.BaseController;
@@ -24,6 +23,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
24 23
 import com.ruoyi.common.log.annotation.Log;
25 24
 import com.ruoyi.common.log.enums.BusinessType;
26 25
 import com.ruoyi.common.security.annotation.RequiresPermissions;
26
+import com.ruoyi.common.security.utils.SecurityUtils;
27 27
 import com.ruoyi.job.domain.SysJob;
28 28
 import com.ruoyi.job.service.ISysJobService;
29 29
 import com.ruoyi.job.util.CronUtils;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
14 14
 import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.UserConstants;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
19 18
 import com.ruoyi.common.core.web.controller.BaseController;
20 19
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -22,6 +21,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
22 21
 import com.ruoyi.common.log.annotation.Log;
23 22
 import com.ruoyi.common.log.enums.BusinessType;
24 23
 import com.ruoyi.common.security.annotation.RequiresPermissions;
24
+import com.ruoyi.common.security.utils.SecurityUtils;
25 25
 import com.ruoyi.system.domain.SysConfig;
26 26
 import com.ruoyi.system.service.ISysConfigService;
27 27
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java

@@ -14,13 +14,13 @@ import org.springframework.web.bind.annotation.RequestBody;
14 14
 import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.UserConstants;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.StringUtils;
19 18
 import com.ruoyi.common.core.web.controller.BaseController;
20 19
 import com.ruoyi.common.core.web.domain.AjaxResult;
21 20
 import com.ruoyi.common.log.annotation.Log;
22 21
 import com.ruoyi.common.log.enums.BusinessType;
23 22
 import com.ruoyi.common.security.annotation.RequiresPermissions;
23
+import com.ruoyi.common.security.utils.SecurityUtils;
24 24
 import com.ruoyi.system.api.domain.SysDept;
25 25
 import com.ruoyi.system.service.ISysDeptService;
26 26
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.PutMapping;
14 14
 import org.springframework.web.bind.annotation.RequestBody;
15 15
 import org.springframework.web.bind.annotation.RequestMapping;
16 16
 import org.springframework.web.bind.annotation.RestController;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.StringUtils;
19 18
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
20 19
 import com.ruoyi.common.core.web.controller.BaseController;
@@ -23,6 +22,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
23 22
 import com.ruoyi.common.log.annotation.Log;
24 23
 import com.ruoyi.common.log.enums.BusinessType;
25 24
 import com.ruoyi.common.security.annotation.RequiresPermissions;
25
+import com.ruoyi.common.security.utils.SecurityUtils;
26 26
 import com.ruoyi.system.api.domain.SysDictData;
27 27
 import com.ruoyi.system.service.ISysDictDataService;
28 28
 import com.ruoyi.system.service.ISysDictTypeService;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
14 14
 import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.UserConstants;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
19 18
 import com.ruoyi.common.core.web.controller.BaseController;
20 19
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -22,6 +21,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
22 21
 import com.ruoyi.common.log.annotation.Log;
23 22
 import com.ruoyi.common.log.enums.BusinessType;
24 23
 import com.ruoyi.common.security.annotation.RequiresPermissions;
24
+import com.ruoyi.common.security.utils.SecurityUtils;
25 25
 import com.ruoyi.system.api.domain.SysDictType;
26 26
 import com.ruoyi.system.service.ISysDictTypeService;
27 27
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java

@@ -12,13 +12,13 @@ import org.springframework.web.bind.annotation.RequestBody;
12 12
 import org.springframework.web.bind.annotation.RequestMapping;
13 13
 import org.springframework.web.bind.annotation.RestController;
14 14
 import com.ruoyi.common.core.constant.UserConstants;
15
-import com.ruoyi.common.core.utils.SecurityUtils;
16 15
 import com.ruoyi.common.core.utils.StringUtils;
17 16
 import com.ruoyi.common.core.web.controller.BaseController;
18 17
 import com.ruoyi.common.core.web.domain.AjaxResult;
19 18
 import com.ruoyi.common.log.annotation.Log;
20 19
 import com.ruoyi.common.log.enums.BusinessType;
21 20
 import com.ruoyi.common.security.annotation.RequiresPermissions;
21
+import com.ruoyi.common.security.utils.SecurityUtils;
22 22
 import com.ruoyi.system.domain.SysMenu;
23 23
 import com.ruoyi.system.service.ISysMenuService;
24 24
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java

@@ -11,13 +11,13 @@ import org.springframework.web.bind.annotation.PutMapping;
11 11
 import org.springframework.web.bind.annotation.RequestBody;
12 12
 import org.springframework.web.bind.annotation.RequestMapping;
13 13
 import org.springframework.web.bind.annotation.RestController;
14
-import com.ruoyi.common.core.utils.SecurityUtils;
15 14
 import com.ruoyi.common.core.web.controller.BaseController;
16 15
 import com.ruoyi.common.core.web.domain.AjaxResult;
17 16
 import com.ruoyi.common.core.web.page.TableDataInfo;
18 17
 import com.ruoyi.common.log.annotation.Log;
19 18
 import com.ruoyi.common.log.enums.BusinessType;
20 19
 import com.ruoyi.common.security.annotation.RequiresPermissions;
20
+import com.ruoyi.common.security.utils.SecurityUtils;
21 21
 import com.ruoyi.system.domain.SysNotice;
22 22
 import com.ruoyi.system.service.ISysNoticeService;
23 23
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
14 14
 import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.UserConstants;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
19 18
 import com.ruoyi.common.core.web.controller.BaseController;
20 19
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -22,6 +21,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
22 21
 import com.ruoyi.common.log.annotation.Log;
23 22
 import com.ruoyi.common.log.enums.BusinessType;
24 23
 import com.ruoyi.common.security.annotation.RequiresPermissions;
24
+import com.ruoyi.common.security.utils.SecurityUtils;
25 25
 import com.ruoyi.system.domain.SysPost;
26 26
 import com.ruoyi.system.service.ISysPostService;
27 27
 

+ 4 - 5
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java

@@ -12,14 +12,13 @@ import org.springframework.web.bind.annotation.RestController;
12 12
 import org.springframework.web.multipart.MultipartFile;
13 13
 import com.ruoyi.common.core.constant.UserConstants;
14 14
 import com.ruoyi.common.core.domain.R;
15
-import com.ruoyi.common.core.utils.SecurityUtils;
16
-import com.ruoyi.common.core.utils.ServletUtils;
17 15
 import com.ruoyi.common.core.utils.StringUtils;
18 16
 import com.ruoyi.common.core.web.controller.BaseController;
19 17
 import com.ruoyi.common.core.web.domain.AjaxResult;
20 18
 import com.ruoyi.common.log.annotation.Log;
21 19
 import com.ruoyi.common.log.enums.BusinessType;
22 20
 import com.ruoyi.common.security.service.TokenService;
21
+import com.ruoyi.common.security.utils.SecurityUtils;
23 22
 import com.ruoyi.system.api.RemoteFileService;
24 23
 import com.ruoyi.system.api.domain.SysFile;
25 24
 import com.ruoyi.system.api.domain.SysUser;
@@ -75,7 +74,7 @@ public class SysProfileController extends BaseController
75 74
         {
76 75
             return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
77 76
         }
78
-        LoginUser loginUser = tokenService.getLoginUser();
77
+        LoginUser loginUser = SecurityUtils.getLoginUser();
79 78
         SysUser sysUser = loginUser.getSysUser();
80 79
         user.setUserId(sysUser.getUserId());
81 80
         user.setPassword(null);
@@ -113,7 +112,7 @@ public class SysProfileController extends BaseController
113 112
         if (userService.resetUserPwd(username, SecurityUtils.encryptPassword(newPassword)) > 0)
114 113
         {
115 114
             // 更新缓存用户密码
116
-            LoginUser loginUser = tokenService.getLoginUser();
115
+            LoginUser loginUser = SecurityUtils.getLoginUser();
117 116
             loginUser.getSysUser().setPassword(SecurityUtils.encryptPassword(newPassword));
118 117
             tokenService.setLoginUser(loginUser);
119 118
             return AjaxResult.success();
@@ -130,7 +129,7 @@ public class SysProfileController extends BaseController
130 129
     {
131 130
         if (!file.isEmpty())
132 131
         {
133
-            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
132
+            LoginUser loginUser = SecurityUtils.getLoginUser();
134 133
             R<SysFile> fileResult = remoteFileService.upload(file);
135 134
             if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData()))
136 135
             {

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
14 14
 import org.springframework.web.bind.annotation.RequestMapping;
15 15
 import org.springframework.web.bind.annotation.RestController;
16 16
 import com.ruoyi.common.core.constant.UserConstants;
17
-import com.ruoyi.common.core.utils.SecurityUtils;
18 17
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
19 18
 import com.ruoyi.common.core.web.controller.BaseController;
20 19
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -22,6 +21,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
22 21
 import com.ruoyi.common.log.annotation.Log;
23 22
 import com.ruoyi.common.log.enums.BusinessType;
24 23
 import com.ruoyi.common.security.annotation.RequiresPermissions;
24
+import com.ruoyi.common.security.utils.SecurityUtils;
25 25
 import com.ruoyi.system.api.domain.SysRole;
26 26
 import com.ruoyi.system.api.domain.SysUser;
27 27
 import com.ruoyi.system.domain.SysUserRole;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

@@ -19,7 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
19 19
 import org.springframework.web.multipart.MultipartFile;
20 20
 import com.ruoyi.common.core.constant.UserConstants;
21 21
 import com.ruoyi.common.core.domain.R;
22
-import com.ruoyi.common.core.utils.SecurityUtils;
23 22
 import com.ruoyi.common.core.utils.StringUtils;
24 23
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
25 24
 import com.ruoyi.common.core.web.controller.BaseController;
@@ -29,6 +28,7 @@ import com.ruoyi.common.log.annotation.Log;
29 28
 import com.ruoyi.common.log.enums.BusinessType;
30 29
 import com.ruoyi.common.security.annotation.InnerAuth;
31 30
 import com.ruoyi.common.security.annotation.RequiresPermissions;
31
+import com.ruoyi.common.security.utils.SecurityUtils;
32 32
 import com.ruoyi.system.api.domain.SysRole;
33 33
 import com.ruoyi.system.api.domain.SysUser;
34 34
 import com.ruoyi.system.api.model.LoginUser;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java

@@ -9,10 +9,10 @@ import org.springframework.stereotype.Service;
9 9
 import com.ruoyi.common.core.constant.UserConstants;
10 10
 import com.ruoyi.common.core.exception.ServiceException;
11 11
 import com.ruoyi.common.core.text.Convert;
12
-import com.ruoyi.common.core.utils.SecurityUtils;
13 12
 import com.ruoyi.common.core.utils.SpringUtils;
14 13
 import com.ruoyi.common.core.utils.StringUtils;
15 14
 import com.ruoyi.common.datascope.annotation.DataScope;
15
+import com.ruoyi.common.security.utils.SecurityUtils;
16 16
 import com.ruoyi.system.api.domain.SysDept;
17 17
 import com.ruoyi.system.api.domain.SysRole;
18 18
 import com.ruoyi.system.api.domain.SysUser;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java

@@ -12,8 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
12 12
 import org.springframework.stereotype.Service;
13 13
 import com.ruoyi.common.core.constant.Constants;
14 14
 import com.ruoyi.common.core.constant.UserConstants;
15
-import com.ruoyi.common.core.utils.SecurityUtils;
16 15
 import com.ruoyi.common.core.utils.StringUtils;
16
+import com.ruoyi.common.security.utils.SecurityUtils;
17 17
 import com.ruoyi.system.api.domain.SysRole;
18 18
 import com.ruoyi.system.api.domain.SysUser;
19 19
 import com.ruoyi.system.domain.SysMenu;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java

@@ -10,10 +10,10 @@ import org.springframework.stereotype.Service;
10 10
 import org.springframework.transaction.annotation.Transactional;
11 11
 import com.ruoyi.common.core.constant.UserConstants;
12 12
 import com.ruoyi.common.core.exception.ServiceException;
13
-import com.ruoyi.common.core.utils.SecurityUtils;
14 13
 import com.ruoyi.common.core.utils.SpringUtils;
15 14
 import com.ruoyi.common.core.utils.StringUtils;
16 15
 import com.ruoyi.common.datascope.annotation.DataScope;
16
+import com.ruoyi.common.security.utils.SecurityUtils;
17 17
 import com.ruoyi.system.api.domain.SysRole;
18 18
 import com.ruoyi.system.api.domain.SysUser;
19 19
 import com.ruoyi.system.domain.SysRoleDept;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -9,10 +9,10 @@ import org.springframework.stereotype.Service;
9 9
 import org.springframework.transaction.annotation.Transactional;
10 10
 import com.ruoyi.common.core.constant.UserConstants;
11 11
 import com.ruoyi.common.core.exception.ServiceException;
12
-import com.ruoyi.common.core.utils.SecurityUtils;
13 12
 import com.ruoyi.common.core.utils.SpringUtils;
14 13
 import com.ruoyi.common.core.utils.StringUtils;
15 14
 import com.ruoyi.common.datascope.annotation.DataScope;
15
+import com.ruoyi.common.security.utils.SecurityUtils;
16 16
 import com.ruoyi.system.api.domain.SysRole;
17 17
 import com.ruoyi.system.api.domain.SysUser;
18 18
 import com.ruoyi.system.domain.SysPost;