Procházet zdrojové kódy

更新用户登录权限

tsurumure před 2 týdny
rodič
revize
a7e656a99b

+ 0 - 1
src/main/java/com/backendsys/modules/TestController.java

@@ -75,7 +75,6 @@ public class TestController {
     @GetMapping("/testExtractToken")
     public Claims extractToken(String token) {
         Claims claims = jwtUtil.extractAllClaims(token);
-        System.out.println("claims = " + claims);
         return claims;
     }
 

+ 13 - 40
src/main/java/com/backendsys/modules/material/service/impl/MaterialUserServiceImpl.java

@@ -155,44 +155,17 @@ public class MaterialUserServiceImpl implements MaterialUserService {
         sysUserRoleRelationDao.delete(wrapperRoleRelation);
         sysUserRoleRelationDao.insertBatch(materialAudit.getUser_id(), Arrays.asList(materialAudit.getRole_id()));
 
-        /*
-            Token 解析结果:
-                Claims claims = jwtUtil.extractAllClaims(token);
-                {
-                    "sub": "8fc878c1-0a67-4cd0-a0de-eced643e5546",
-                    "userInfo": {
-                        "id": 1,
-                        "user_id": 1,
-                        "username": "admin",
-                        "last_login_uuid": "8fc878c1-0a67-4cd0-a0de-eced643e5546",
-                        "is_super": -1,
-                        "token_expiration": "2025-08-24 14:55:44",
-                        "target": null,
-                        "roles": [
-                            {
-                                "role_id": 4,
-                                "role_sign": "MATERIAL_ADMIN",
-                                "role_name": "素材库-管理员",
-                                "login_default_page": "/material/materialList"
-                            }
-                        ]
-                    },
-                    "target": "System",
-                    "exp": 1756018544
-                }
-
-
-            Redis Key:backendsys:local:login:token:8fc878c1-0a67-4cd0-a0de-eced643e5546
-            Redis Value:
-            "\"{\\\"token\\\":\\\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4ZmM4NzhjMS0wYTY3LTRjZDAtYTBkZS1lY2VkNjQzZTU1NDYiLCJ1c2VySW5mbyI6eyJpZCI6MSwidXNlcl9pZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImxhc3RfbG9naW5fdXVpZCI6IjhmYzg3OGMxLTBhNjctNGNkMC1hMGRlLWVjZWQ2NDNlNTU0NiIsImlzX3N1cGVyIjotMSwidG9rZW5fZXhwaXJhdGlvbiI6IjIwMjUtMDgtMjQgMTQ6NTU6NDQiLCJ0YXJnZXQiOm51bGwsInJvbGVzIjpbeyJyb2xlX2lkIjo0LCJyb2xlX3NpZ24iOiJNQVRFUklBTF9BRE1JTiIsInJvbGVfbmFtZSI6Iue0oOadkOW6ky3nrqHnkIblkZgiLCJsb2dpbl9kZWZhdWx0X3BhZ2UiOiIvbWF0ZXJpYWwvbWF0ZXJpYWxMaXN0In1dfSwidGFyZ2V0IjoiU3lzdGVtIiwiZXhwIjoxNzU2MDE4NTQ0fQ.Mz9juWF2sqioaFMAdTJtcoTQONZFfCGDaRuibbVn2Mw\\\",\\\"permission_ids\\\":[\\\"1.1.2\\\",\\\"1.1.3\\\",\\\"1.1.6\\\",\\\"3.2.3.3\\\",\\\"3.5.1\\\",\\\"20\\\",\\\"20.1\\\",\\\"20.1.1\\\",\\\"20.1.2\\\",\\\"20.1.3\\\",\\\"20.1.4\\\",\\\"20.1.5\\\",\\\"20.2\\\",\\\"20.3\\\",\\\"20.4\\\",\\\"20.4.1\\\"]}\""
-
-
-            // SecurityUserInfo(id=1, user_id=1, username=admin, last_login_uuid=8fc878c1-0a67-4cd0-a0de-eced643e5546, is_super=-1, token_expiration=2025-08-24 14:55:44, target=null, roles=[{role_id=4, role_sign=MATERIAL_ADMIN, role_name=素材库-管理员, login_default_page=/material/materialList}])
-
-         */
-        // 实时更新:用户信息/角色/权限 (发送SSE)
-        userUtil.syncUpdateUserCatch(userInfo);
-        sseUtil.send(userInfo.getUser_id(), new SseResponse(SseResponseEnum.SYSTEM_USER_UPDATE, userInfo).toJsonStr());
+
+        // 重置的过期时间直接给7天
+        Long tokenDurationMilliseconds = userUtil.getTokenDuration(true);
+        Integer tokenDurationHours = Convert.toInt(tokenDurationMilliseconds / 3600000L);
+        // 实时更新缓存: 用户信息
+        SysUserInfo userInfoLasest = sysUserService.selectUserInfo(entity);
+        // 赋加缓存时间 { token_expiration }
+        SysUserInfo userInfoLasestCatch = userUtil.syncUpdateUserCatch(userInfoLasest, tokenDurationHours, true);
+
+        // 发送SSE消息到前端
+        sseUtil.send(userInfoLasestCatch.getUser_id(), new SseResponse(SseResponseEnum.SYSTEM_USER_UPDATE, userInfoLasestCatch).toJsonStr());
 
         return Map.of("user_id", materialAudit.getUser_id());
     }
@@ -242,7 +215,7 @@ public class MaterialUserServiceImpl implements MaterialUserService {
         SysUser sysUserDetail = sysUserDao.selectOne(queryWrapper);
         if (sysUserDetail != null) {
             // [已注册] 返回登录信息 (并且7天免登录)
-            SysUserInfo sysUserInfo = sysAuthService.loginSuccess(sysUserDetail.getId(), 1);
+            SysUserInfo sysUserInfo = sysAuthService.loginSuccess(sysUserDetail.getId(), true);
             Map<String, Object> response = BeanUtil.beanToMap(sysUserInfo);
             response.put("is_register", false);
             return response;
@@ -276,7 +249,7 @@ public class MaterialUserServiceImpl implements MaterialUserService {
             sysUserIntegralService.init(registerEntity.getId());
 
             // [DB] 查询用户信息
-            SysUserInfo sysUserInfo = sysAuthService.loginSuccess(registerEntity.getId(), 1);
+            SysUserInfo sysUserInfo = sysAuthService.loginSuccess(registerEntity.getId(), true);
             Map<String, Object> response = BeanUtil.beanToMap(sysUserInfo);
             response.put("is_register", true);
             return response;

+ 1 - 1
src/main/java/com/backendsys/modules/system/entity/SysAuth.java

@@ -21,5 +21,5 @@ public class SysAuth {
     // @NotEmpty(message="验证码不能为空", groups = { Login.class, Register.class })
     private String captcha;
 
-    private Integer is_remember;
+    private Boolean is_remember;
 }

+ 1 - 1
src/main/java/com/backendsys/modules/system/entity/SysAuthPhone.java

@@ -29,5 +29,5 @@ public class SysAuthPhone {
     @Max(value = 999999, message = "验证码长度是 6 位字符", groups = { Register.class })
     private Integer phone_valid_code;
 
-    private Integer is_remember;
+    private Boolean is_remember;
 }

+ 1 - 1
src/main/java/com/backendsys/modules/system/service/SysAuthService.java

@@ -24,5 +24,5 @@ public interface SysAuthService {
     void loginFail(String errMsg, String username, Boolean isIntercept);
     void cleanLoginRequired(String key);
     // [方法] 登录成功
-    SysUserInfo loginSuccess(Long user_id, Integer is_remember);
+    SysUserInfo loginSuccess(Long user_id, Boolean is_remember);
 }

+ 15 - 13
src/main/java/com/backendsys/modules/system/service/impl/SysAuthServiceImpl.java

@@ -152,7 +152,7 @@ public class SysAuthServiceImpl implements SysAuthService {
     }
 
     // [方法] 登录成功
-    public SysUserInfo loginSuccess(Long user_id, Integer is_remember) {
+    public SysUserInfo loginSuccess(Long user_id, Boolean is_remember) {
 
         // [查询] 登录的用户信息
         SysUserInfo entity = new SysUserInfo();
@@ -186,21 +186,23 @@ public class SysAuthServiceImpl implements SysAuthService {
         sysUserInfo.setLast_login_time(LocalDateTime.now(ZoneOffset.UTC));
         sysUserInfoDao.updateById(sysUserInfo);
 
-        // [系统配置] 系统用户默认登录过期时间(小时)
-        Integer SYSTEM_USER_LOGIN_DURATION_DEFAULT = Convert.toInt(sysCommonService.getCommonByTag("SYSTEM_USER_LOGIN_DURATION_DEFAULT"));
-        // 将小时转换为毫秒
-        Long DEFAULT_MILLISECONDS = SYSTEM_USER_LOGIN_DURATION_DEFAULT * DateUnit.HOUR.getMillis();
-        // 7天 (转毫秒)
-        Long SEVEN_DAY_MILLISECONDS = 7L * 24 * 60 * 60 * 1000;
-        // 是否钩选 "7天免登录",否则按系统配置-默认过期时间
-        Long token_duration_milliseconds = (is_remember != null && is_remember.equals(1)) ? SEVEN_DAY_MILLISECONDS : DEFAULT_MILLISECONDS;
-        Integer tokenDurationHours = Convert.toInt(token_duration_milliseconds / 3600000L);
-
-        Date token_expiration = new Date((new Date()).getTime() + token_duration_milliseconds);
+//        // [系统配置] 系统用户默认登录过期时间(小时)
+//        Integer SYSTEM_USER_LOGIN_DURATION_DEFAULT = Convert.toInt(sysCommonService.getCommonByTag("SYSTEM_USER_LOGIN_DURATION_DEFAULT"));
+//        // 将小时转换为毫秒
+//        Long DEFAULT_MILLISECONDS = SYSTEM_USER_LOGIN_DURATION_DEFAULT * DateUnit.HOUR.getMillis();
+//        // 7天 (转毫秒)
+//        Long SEVEN_DAY_MILLISECONDS = 7L * 24 * 60 * 60 * 1000;
+//        // 是否钩选 "7天免登录",否则按系统配置-默认过期时间
+//        Long token_duration_milliseconds = (is_remember != null && is_remember.equals(1)) ? SEVEN_DAY_MILLISECONDS : DEFAULT_MILLISECONDS;
+//        Integer tokenDurationHours = Convert.toInt(token_duration_milliseconds / 3600000L);
+
+        Long tokenDurationMilliseconds = userUtil.getTokenDuration(is_remember);
+        Integer tokenDurationHours = Convert.toInt(tokenDurationMilliseconds / 3600000L);
+        Date token_expiration = new Date((new Date()).getTime() + tokenDurationMilliseconds);
         sysUserInfo.setToken_expiration(DateUtil.format(token_expiration, "yyyy-MM-dd HH:mm:ss"));
 
         // 实时更新缓存: 用户信息
-        sysUserInfo = userUtil.syncUpdateUserCatch(sysUserInfo, tokenDurationHours);
+        sysUserInfo = userUtil.syncUpdateUserCatch(sysUserInfo, tokenDurationHours, is_remember);
 
         //// 生成 Token
         //SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(sysUserInfo), SecurityUserInfo.class);

+ 28 - 9
src/main/java/com/backendsys/modules/system/utils/UserUtil.java

@@ -26,36 +26,55 @@ public class UserUtil {
     private JwtUtil jwtUtil;
     @Autowired
     private RedisUtil redisUtil;
+    
+    @Autowired
+    private SysCommonService sysCommonService;
 
     @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
     private String REDIS_LOGIN_TOKEN_PREFIX;
 
+    public static final long SEVEN_DAYS_MILLIS = 7L * 24 * 60 * 60 * 1000;
+
     /**
      * 实时更新缓存: 用户信息
      */
-    public SysUserInfo syncUpdateUserCatch(SysUserInfo userInfo) {
-        return syncUpdateUserCatch(userInfo, null);
-    }
+    public SysUserInfo syncUpdateUserCatch(SysUserInfo userInfo, Integer tokenDurationHours, Boolean isRemember) {
+
+        // -- 重置过期时间 -----------------------------------
+        Integer durationHours = tokenDurationHours != null ? tokenDurationHours : Convert.toInt(SEVEN_DAYS_MILLIS / 3600000L);
+        Long tokenDurationMilliseconds = getTokenDuration(isRemember);
+        Date tokenExpiration = new Date((new Date()).getTime() + tokenDurationMilliseconds);
+        userInfo.setToken_expiration(DateUtil.format(tokenExpiration, "yyyy-MM-dd HH:mm:ss"));
 
-    public SysUserInfo syncUpdateUserCatch(SysUserInfo userInfo, Integer tokenDurationHours) {
         // 生成 Token
         String lastLoginUuid = userInfo.getLast_login_uuid();
         SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(userInfo), SecurityUserInfo.class);
+
         String token = jwtUtil.createSystemJwtToken(securityUserInfo);
         userInfo.setToken(token);
 
         // [Redis] 将 Token 与 Permission 存入缓存
         String tokenRedisKey = REDIS_LOGIN_TOKEN_PREFIX + lastLoginUuid;
         TokenCatch tokenCatch = new TokenCatch(token, userInfo.getPermission_ids());
-
-        // -- 重置过期时间,直接给7天 -----------------------------------
-        Integer durationHours = tokenDurationHours != null ? tokenDurationHours : Convert.toInt(7L * 24 * 60 * 60 * 1000 / 3600000L);
         redisUtil.setCacheObject(tokenRedisKey, JSONUtil.toJsonStr(tokenCatch), durationHours, TimeUnit.HOURS);
 
-        System.out.println("-- 实时更新用户信息 (syncUpdateUserInfo) --");
-        System.out.println(userInfo);
+        System.out.println("syncUpdateUserCatch = " + userInfo);
 
         return userInfo;
     }
 
+
+    /**
+     * 获得登录过期时间 (毫秒)
+     */
+    public Long getTokenDuration(Boolean isRemember) {
+        System.out.println("isRemember = " + isRemember);
+        // [系统配置] 系统用户默认登录过期时间(小时)
+        Integer SYSTEM_USER_LOGIN_DURATION_DEFAULT = Convert.toInt(sysCommonService.getCommonByTag("SYSTEM_USER_LOGIN_DURATION_DEFAULT"));
+        // 将小时转换为毫秒
+        Long DEFAULT_MILLISECONDS = SYSTEM_USER_LOGIN_DURATION_DEFAULT * DateUnit.HOUR.getMillis();
+        // 是否钩选 "7天免登录",否则按系统配置-默认过期时间
+        Long tokenDurationMilliseconds = isRemember ? SEVEN_DAYS_MILLIS : DEFAULT_MILLISECONDS;
+        return tokenDurationMilliseconds;
+    }
 }