ソースを参照

pms token 自动续期

zhangcl 3 日 前
コミット
90e689da86

+ 15 - 1
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java

@@ -31,6 +31,9 @@ import java.io.IOException;
 @RequiredArgsConstructor
 public class TokenAuthenticationFilter extends OncePerRequestFilter {
 
+    // 需要排除Token续期的接口路径
+    private static final String EXCLUDED_API_PATH = "/admin-api/system/notify-message/get-unread-count";
+
     private final SecurityProperties securityProperties;
 
     private final GlobalExceptionHandler globalExceptionHandler;
@@ -52,7 +55,8 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
                 if (loginUser == null) {
                     loginUser = mockLoginUser(request, token, userType);
                 }
-
+                // 延长双 token 过期时间 延长 30分钟
+                renewTokenExpireTime(token);
                 // 2. 设置当前用户
                 if (loginUser != null) {
                     SecurityFrameworkUtils.setLoginUser(loginUser, request);
@@ -68,6 +72,16 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
         chain.doFilter(request, response);
     }
 
+    /**
+     * 延长 accessToken refreshToken 过期时间
+     * 只要在操作系统功能 token 就不会过期
+     * @param accessToken
+     */
+    private void renewTokenExpireTime(String accessToken) {
+        // 对当前token进行续期 延期
+        oauth2TokenApi.renewTokenExpireTime(accessToken);
+    }
+
     private LoginUser buildLoginUserByToken(String token, Integer userType) {
         try {
             OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);

+ 5 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApi.java

@@ -46,4 +46,9 @@ public interface OAuth2TokenApi {
      */
     OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId);
 
+    /**
+     * 续期双 token 的过期时间
+     * @param accessToken
+     */
+    void renewTokenExpireTime(String accessToken);
 }

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApiImpl.java

@@ -46,4 +46,9 @@ public class OAuth2TokenApiImpl implements OAuth2TokenApi {
         return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class);
     }
 
+    @Override
+    public void renewTokenExpireTime(String accessToken) {
+        oauth2TokenService.renewTokenExpireTime(accessToken);
+    }
+
 }

+ 10 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java

@@ -47,6 +47,16 @@ public class OAuth2AccessTokenRedisDAO {
         stringRedisTemplate.delete(redisKey);
     }
 
+    /**
+     * 续期 accessToken refreshToken
+     * @param accessToken
+     */
+    public void renewToken(String accessToken, String refreshToken) {
+        String redisKey = formatKey(accessToken);
+        stringRedisTemplate.expire(redisKey, 30, TimeUnit.MINUTES);
+        // stringRedisTemplate.delete(redisKey);
+    }
+
     public void deleteList(Collection<String> accessTokens) {
         List<String> redisKeys = CollectionUtils.convertList(accessTokens, OAuth2AccessTokenRedisDAO::formatKey);
         stringRedisTemplate.delete(redisKeys);

+ 6 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenService.java

@@ -77,4 +77,10 @@ public interface OAuth2TokenService {
      */
     PageResult<OAuth2AccessTokenDO> getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO);
 
+    /**
+     * 续期 accessToken refreshToken
+     * @param accessToken
+     */
+    void renewTokenExpireTime(String accessToken);
+
 }

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -158,6 +158,13 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         return oauth2AccessTokenMapper.selectPage(reqVO);
     }
 
+    @Override
+    public void renewTokenExpireTime(String accessToken) {
+        OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken);
+        String refreshToken = accessTokenDO.getRefreshToken();
+        oauth2AccessTokenRedisDAO.renewToken(accessToken, refreshToken);
+    }
+
     private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
         OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken())
                 .setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType())