ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -254,15 +254,18 @@
                // 管理员拥有所有权限,跳过
                continue;
            }
            // 判断该用户是否拥有此角色
            boolean previouslyHadRole = loginUser.getUser().getRoles() != null
                    && loginUser.getUser().getRoles().stream().anyMatch(r -> roleId.equals(r.getRoleId()));
            // 权限计算会同时读取当前角色关系,覆盖新增角色未进入旧 token 的情况。
            java.util.Set<String> permissions = permissionService.getMenuPermission(loginUser.getUser());
            boolean hasRole = loginUser.getUser().getRoles() != null
                    && loginUser.getUser().getRoles().stream().anyMatch(r -> roleId.equals(r.getRoleId()));
            if (!hasRole)
            if (!previouslyHadRole && !hasRole)
            {
                continue;
            }
            // 刷新权限缓存
            loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
            loginUser.setPermissions(permissions);
            refreshToken(loginUser);
            log.info("角色[{}]权限变更,已刷新在线用户[{}]的权限缓存", roleId, loginUser.getUsername());
        }