极狐GitLab 正式推出面向 GitLab 老旧版本(12.x、13.x、14.x、15.x 等)免费用户的专业升级服务,点击查看详情

极狐GitLab论坛 门户 查看主题

API获取用户有权限的项目问题

发布者: 就想起一个特别特别特别长的长名字 | 发布时间: 2025-8-26 17:56| 查看数: 56| 评论数: 0|帖子模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×

我现在想要查询某个用户的项目,使用的管理员账号,token权限已经开到最大了,但是无论怎么样都查询不出数据

API文档:https://gitlab.cn/docs/jh/api/projects/#%E5%88%86%E9%A1%B5%E9%99%90%E5%88%B6

image.png


    /**
     * 分页查询用户是成员的所有项目(自动处理所有分页)
     * @param userId 用户ID
     * @param includeInherited 是否包含通过群组继承的项目
     * @return 所有用户是成员的项目
     * @throws IOException 网络请求异常
     */
    public List<Map<String, Object>> getAllUserMemberProjects(Integer userId, boolean includeInherited) throws IOException {
        List<Map<String, Object>> allProjects = new ArrayList<>();
        int page = 1;
        int perPage = 100;
        boolean hasMore = true;

        while (hasMore) {
            List<Map<String, Object>> pageProjects = getUserMemberProjects(userId, includeInherited, page, perPage);
            if (pageProjects.isEmpty()) {
                hasMore = false;
            } else {
                allProjects.addAll(pageProjects);
                page++;
                // 防止无限循环,实际项目中可根据总数量限制
                if (pageProjects.size() < perPage) {
                    hasMore = false;
                }
            }
        }

        return allProjects;
    }

    /**
     * 查询指定用户是成员的所有项目
     * @param userId 用户ID
     * @param includeInherited 是否包含通过群组继承的项目成员关系
     * @param page 页码,从1开始
     * @param perPage 每页项目数量,最大100
     * @return 用户作为成员的项目列表
     * @throws IOException 网络请求异常
     */
    public List<Map<String, Object>> getUserMemberProjects(Integer userId, boolean includeInherited, int page, int perPage) throws IOException {
        if (userId == null) {
            throw new IllegalArgumentException("用户ID不能为空");
        }

        // 确保每页数量不超过100
        perPage = Math.min(perPage, 100);

        // 构建请求URL
        HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/users/"+userId+"/projects")
                .newBuilder()
                .addQueryParameter("page", String.valueOf(page))
                .addQueryParameter("per_page", String.valueOf(perPage))
                .addQueryParameter("membership", "true") // 只返回用户是成员的项目
                .addQueryParameter("with_access_level", "true") // 返回权限级别
                .addQueryParameter("visibility", "private") // 返回权限级别
                .addQueryParameter("simple", "false") // 获取完整项目信息
                .addQueryParameter("owned", "false") //
                ;

        // 是否包含通过群组继承的成员关系
        if (!includeInherited) {
            urlBuilder.addQueryParameter("min_access_level", "10");
            urlBuilder.addQueryParameter("access_level", "10");
            urlBuilder.addQueryParameter("user_access_level", "10");
            urlBuilder.addQueryParameter("skip_groups", "true");
            urlBuilder.addQueryParameter("include_subgroups", "true");
        }

        Request request = new Request.Builder()
                .url(urlBuilder.build())
                .addHeader("Private-Token", PRIVATE_TOKEN) // 使用管理员 Token
                .addHeader("Accept", "application/json")
                .get()
                .build();

        try (Response response = client.newCall(request).execute()) {
            String responseBody = response.body().string();
            if (!response.isSuccessful()) {
                throw new IOException("查询用户成员项目失败: " + responseBody);
            }

            // 解析JSON响应
            JsonNode projectsNode = objectMapper.readTree(responseBody);
            List<Map<String, Object>> projects = new ArrayList<>();

            if (projectsNode.isArray()) {
                for (JsonNode projectNode : projectsNode) {
                    Map<String, Object> project = new HashMap<>();

                    // 项目基本信息
                    project.put("projectId", projectNode.get("id").asInt());
                    project.put("projectName", projectNode.get("name"));
                    project.put("nameWithNamespace", projectNode.get("name_with_namespace"));
                    project.put("description", projectNode.has("description") ?
                            projectNode.get("description").asText() : "");
                    project.put("webUrl", projectNode.get("web_url"));

                    // 成员权限信息
                    int accessLevel = projectNode.get("access_level").asInt();
                    project.put("accessLevel", accessLevel);
                    project.put("accessLevelName", getAccessLevelName(accessLevel));

                    // 成员关系类型(直接添加还是通过群组继承)
                    project.put("membershipType", projectNode.has("via_group") ?
                            "inherited (group: " + projectNode.get("via_group").get("name") + ")" :
                            "direct");

                    projects.add(project);
                }
            }

            return projects;
        }
    }

最新评论

浏览过的版块

意见建议

Email:forum@gitlab.cn
  • 关注公众号
  • 添加专业顾问
Copyright © 2001-2025 极狐GitLab论坛 版权所有 All Rights Reserved. 鄂ICP备2021008419号-1|鄂公网安备42018502006137号
关灯 快速发帖
扫一扫添加专业顾问
返回顶部
快速回复 返回顶部 返回列表