Răsfoiți Sursa

优化登录Token

tsurumure 5 luni în urmă
părinte
comite
694d9adac6

+ 3 - 0
src/main/java/com/backendsys/modules/common/config/security/utils/HttpRequestUtil.java

@@ -37,6 +37,9 @@ public class HttpRequestUtil {
             Claims tokenInfo = tokenUtil.getTokenInfo(request);
             if (tokenInfo != null) {
                 Map<String, Object> userInfo = (Map<String, Object>) tokenInfo.get("userInfo");
+
+                System.out.println("userInfo: " + userInfo);
+
                 return Convert.toLong(userInfo.get("user_id"));
             }
         }

+ 0 - 122
src/main/java/com/backendsys/modules/common/config/security/utils/PermissionUtil.java

@@ -1,122 +0,0 @@
-//package com.backendsys.modules.common.config.security.utils;
-//
-//import com.backendsys.exception.CustException;
-//import com.backendsys.modules.common.config.redis.utils.RedisUtil;
-//import com.backendsys.modules.common.config.security.entity.SecurityUserInfo;
-//import com.backendsys.utils.response.ResultEnum;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.stereotype.Service;
-//import org.springframework.util.CollectionUtils;
-//import org.springframework.util.StringUtils;
-//
-//import java.util.*;
-//
-///**
-// * 即将弃用
-// * 自定义权限 @PreAuthorize("@sr.hasPermission('3.2.3') && @ss.isSuper()")
-// */
-//@Service("ss")
-//public class PermissionUtil {
-//    //private static final String ALL_PERMISSION = "*:*:*";
-//
-//    @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
-//    private String REDIS_LOGIN_TOKEN_PREFIX;
-//    @Value("${REDIS_LOGIN_PERMISSION_PREFIX}")
-//    private String REDIS_LOGIN_PERMISSION_PREFIX;
-//
-//    @Autowired
-//    private RedisUtil redisUtil;
-//
-//    /**
-//     * 验证用户是否具备权限
-//     * @param permi 权限字符串
-//     * @return boolean
-//     */
-////    public boolean hasPermi(String permi) {
-//    public boolean hasPermi(Collection<String> permi) {
-//
-//        if (CollectionUtils.isEmpty(permi)) return false;
-//
-//        SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//        // 如果是超级管理员,则直接通过
-//        if (securityUserInfo.getIs_super() == 1) return true;
-//
-//        // 没有 permission_ids 即不是系统用户,即没有访问后台的权限
-//        if (securityUserInfo != null) {
-//
-////            String uuid = securityUserInfo.getLast_login_uuid();
-////            String redis_key = REDIS_LOGIN_PERMISSION_PREFIX + uuid;
-////            String permission_ids_str = redisUtil.getCacheObject(redis_key);
-////            List<String> permission_ids = Arrays.asList(permission_ids_str.split(","));
-//
-//            List<String> permission_ids = securityUserInfo.getPermission_ids();
-//
-//            if (permission_ids != null && !permission_ids.isEmpty()) {
-//                Set<String> dataSet = new HashSet<>();
-//                for (String permission_id : permission_ids) {
-//                    dataSet.add(permission_id);
-//                }
-//                for (String permission : permi) {
-//                    if (hasPermissions(dataSet, permission)) {
-//                        return true;
-//                    }
-//                }
-//                // return hasPermissions(modulesSet, permission);
-//            }
-//        }
-//        return false;
-//    }
-//    public boolean hasPermissions(Set<String> permi, String permission) {
-//        return permi.contains(StringUtils.trimAllWhitespace(permission));
-//    }
-//
-//    // 是否超级管理员
-//    public boolean isSuper() {
-//        SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//        return securityUserInfo.getIs_super() == 1;
-//    }
-//
-//    // 是否超级管理员 (首位)
-//    public boolean isFirstSuper() {
-//        SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//        return securityUserInfo.getUser_id() == 1;
-//    }
-//
-//    // 是否会员
-//    public boolean isMember() {
-//        SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//        return "Member".equals(securityUserInfo.getTarget());
-//    }
-//
-//
-//    /**
-//     * 判断是否匹配当前 {用户ID} 与 {用户权限},不是则抛出错误
-//     * - 匹配,通过
-//     * - 不匹配,再次检查权限
-//     *    - 匹配,通过
-//     *    - 不匹配,抛出错误
-//     * permissionService.checkUserIdAndPermission(sysUserDTO.getUser_id(), "3.2.1");
-//     */
-//    public void checkUserIdAndPermission(long user_id, Collection<String> permis) {
-//        SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//        if (securityUserInfo.getUser_id() != user_id) {
-//            if (!hasPermi(permis)) {
-//                throw new CustException(ResultEnum.AUTH_ROLE_ERROR.getMessage(), ResultEnum.AUTH_ROLE_ERROR.getCode());
-//            }
-//        }
-//    }
-//
-//    /**
-//     * 判断是否 首位超级管理员 (id:1),不是则抛出错误
-//     */
-//    public void checkSuperAdminOfFirst(long user_id) {
-//        if (user_id == 1) {
-//            SecurityUserInfo securityUserInfo = SecurityUtil.getUserInfo();
-//            if (securityUserInfo.getUser_id() != 1) {
-//                throw new CustException(ResultEnum.AUTH_USER_ERROR.getMessage(), ResultEnum.AUTH_USER_ERROR.getCode());
-//            }
-//        }
-//    }
-//
-//}

+ 6 - 5
src/main/java/com/backendsys/modules/common/config/security/utils/SecurityUtil.java

@@ -8,6 +8,7 @@ import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.redis.utils.RedisUtil;
 import com.backendsys.modules.common.config.security.entity.SecurityUserInfo;
 import com.backendsys.modules.common.enums.MatchType;
+import com.backendsys.modules.system.entity.TokenCatch;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,8 +39,8 @@ import java.util.List;
 @Service("sr")
 public class SecurityUtil {
 
-    @Value("${REDIS_LOGIN_PERMISSION_PREFIX}")
-    private String REDIS_LOGIN_PERMISSION_PREFIX;
+    @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
+    private String REDIS_LOGIN_TOKEN_PREFIX;
 
     @Autowired
     private RedisUtil redisUtil;
@@ -104,9 +105,9 @@ public class SecurityUtil {
     private List<String> getPermissionIds() {
         SecurityUserInfo userInfo = getUserInfo();
         String uuid = userInfo.getLast_login_uuid();
-        String redis_key = REDIS_LOGIN_PERMISSION_PREFIX + uuid;
-        String permission_ids_str = redisUtil.getCacheObject(redis_key);
-        List<String> permission_ids = Arrays.asList(permission_ids_str.split(","));
+        String redis_value = redisUtil.getCacheObject(REDIS_LOGIN_TOKEN_PREFIX + uuid);
+        TokenCatch token_catch = JSONUtil.toBean(redis_value, TokenCatch.class);
+        List<String> permission_ids = token_catch.getPermission_ids(); // Arrays.asList(permission_ids_str.split(","));
         return permission_ids;
     }
 

+ 0 - 4
src/main/java/com/backendsys/modules/common/config/security/utils/TokenUtil.java

@@ -22,9 +22,6 @@ public class TokenUtil {
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
-    @Value("${REDIS_LOGIN_PERMISSION_PREFIX}")
-    private String REDIS_LOGIN_PERMISSION_PREFIX;
-
     @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
     private String REDIS_LOGIN_TOKEN_PREFIX;
 
@@ -51,7 +48,6 @@ public class TokenUtil {
      */
     public void deleteRedisLoginToken(String uuid) {
         stringRedisTemplate.delete(REDIS_LOGIN_TOKEN_PREFIX + (StrUtil.isNotEmpty(uuid) ? uuid : getLoginUUID()));
-        stringRedisTemplate.delete(REDIS_LOGIN_PERMISSION_PREFIX + (StrUtil.isNotEmpty(uuid) ? uuid : getLoginUUID()));
     }
 
     /**

+ 17 - 0
src/main/java/com/backendsys/modules/system/entity/TokenCatch.java

@@ -0,0 +1,17 @@
+package com.backendsys.modules.system.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TokenCatch {
+
+    private String token;
+    private List<String> permission_ids;
+
+}

+ 5 - 10
src/main/java/com/backendsys/modules/system/service/impl/SysAuthServiceImpl.java

@@ -73,8 +73,6 @@ public class SysAuthServiceImpl implements SysAuthService {
 
     @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
     private String REDIS_LOGIN_TOKEN_PREFIX;
-    @Value("${REDIS_LOGIN_PERMISSION_PREFIX}")
-    private String REDIS_LOGIN_PERMISSION_PREFIX;
 
     @Value("${spring.application.name}")
     private String APPLICATION_NAME;
@@ -174,19 +172,16 @@ public class SysAuthServiceImpl implements SysAuthService {
 
         // 生成 Token
         SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(sysUserInfo), SecurityUserInfo.class);
-
         String token = jwtUtil.createSystemJwtToken(securityUserInfo);
         String token_redis_key = REDIS_LOGIN_TOKEN_PREFIX + uuid;
         sysUserInfo.setToken(token);
 
-        // [Redis] 将 Token 存入缓存
-        redisUtil.setCacheObject(token_redis_key, token, token_duration_hours, TimeUnit.HOURS);
-
-        // [Redis] 将 Permission 存入缓存
+        // 生成 PerMissionIds
         List<String> permission_ids_list = sysUserInfo.getPermission_ids();
-        String permission_ids = String.join(",", permission_ids_list);
-        String permission_redis_key = REDIS_LOGIN_PERMISSION_PREFIX + uuid;
-        redisUtil.setCacheObject(permission_redis_key, permission_ids, token_duration_hours, TimeUnit.HOURS);
+
+        // [Redis] 将 Token 与 Permission 存入缓存
+        TokenCatch tokenCatch = new TokenCatch(token, permission_ids_list);
+        redisUtil.setCacheObject(token_redis_key, JSONUtil.toJsonStr(tokenCatch), token_duration_hours, TimeUnit.HOURS);
 
         return sysUserInfo;
     }

+ 0 - 1
src/main/resources/application-local.yml

@@ -16,7 +16,6 @@ API_LOG: true
 
 # [Redis] 缓存键值前缀
 REDIS_LOGIN_TOKEN_PREFIX: "backendsys:local:login:token:"
-REDIS_LOGIN_PERMISSION_PREFIX: "backendsys:local:login:permission:"
 
 
 log-stream:

+ 0 - 1
src/main/resources/application-prod.yml

@@ -16,7 +16,6 @@ API_LOG: false
 
 # [Redis] 缓存键值前缀
 REDIS_LOGIN_TOKEN_PREFIX: "backendsys:prod:login:token:"
-REDIS_LOGIN_PERMISSION_PREFIX: "backendsys:prod:login:permission:"
 
 
 log-stream: