Browse Source

feat:【system】用户被禁用时,删除其相关 token,关联 issue:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/IB2EK6

YunaiV 6 months ago
parent
commit
62e4af4016

+ 5 - 0
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java

@@ -32,4 +32,9 @@ public interface OAuth2AccessTokenMapper extends BaseMapperX<OAuth2AccessTokenDO
                 .orderByDesc(OAuth2AccessTokenDO::getId));
     }
 
+    default List<OAuth2AccessTokenDO> selectListByUserIdAndUserType(Long userId, Integer userType) {
+        return selectList(OAuth2AccessTokenDO::getUserId, userId,
+                OAuth2AccessTokenDO::getUserType, userType);
+    }
+
 }

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

@@ -69,6 +69,17 @@ public interface OAuth2TokenService {
      */
     OAuth2AccessTokenDO removeAccessToken(String accessToken);
 
+    /**
+     * 移除访问令牌
+     * 注意:该流程中,会移除相关的刷新令牌
+     *
+     * 参考 DefaultTokenServices 的 revokeToken 方法
+     *
+     * @param userId 用户编号
+     * @param userType 用户类型
+     */
+    void removeAccessToken(Long userId, Integer userType);
+
     /**
      * 获得访问令牌分页
      *

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

@@ -153,6 +153,21 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         return accessTokenDO;
     }
 
+    @Override
+    public void removeAccessToken(Long userId, Integer userType) {
+        List<OAuth2AccessTokenDO> accessTokens = oauth2AccessTokenMapper.selectListByUserIdAndUserType(userId, userType);
+        if (CollUtil.isEmpty(accessTokens)) {
+            return;
+        }
+        accessTokens.forEach(accessToken -> {
+            // 删除访问令牌
+            oauth2AccessTokenMapper.deleteById(accessToken.getId());
+            oauth2AccessTokenRedisDAO.delete(accessToken.getAccessToken());
+            // 删除刷新令牌
+            oauth2RefreshTokenMapper.deleteByRefreshToken(accessToken.getRefreshToken());
+        });
+    }
+
     @Override
     public PageResult<OAuth2AccessTokenDO> getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO) {
         return oauth2AccessTokenMapper.selectPage(reqVO);

+ 10 - 0
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -26,6 +27,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dept.PostService;
+import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
 import cn.iocoder.yudao.module.system.service.permission.PermissionService;
 import cn.iocoder.yudao.module.system.service.tenant.TenantService;
 import com.google.common.annotations.VisibleForTesting;
@@ -75,6 +77,9 @@ public class AdminUserServiceImpl implements AdminUserService {
     @Resource
     @Lazy // 延迟,避免循环依赖报错
     private TenantService tenantService;
+    @Resource
+    @Lazy // 懒加载,避免循环依赖
+    private OAuth2TokenService oauth2TokenService;
 
     @Resource
     private UserPostMapper userPostMapper;
@@ -227,6 +232,11 @@ public class AdminUserServiceImpl implements AdminUserService {
         updateObj.setId(id);
         updateObj.setStatus(status);
         userMapper.updateById(updateObj);
+
+        // 如果是禁用用户,则删除其 Token 信息
+        if (CommonStatusEnum.isDisable(status)) {
+            oauth2TokenService.removeAccessToken(id, UserTypeEnum.ADMIN.getValue());
+        }
     }
 
     @Override