如何使用 Microsoft Graph Java SDK 按公司名称过滤目录中的用户?

问题描述 投票:0回答:1

我正在使用 Microsoft Graph API 从我的组织中获取用户。这是我到目前为止获取所有用户的内容:

TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(

Collections.singletonList("https://graph.microsoft.com/.default"),
                clientSecretCredential
        );

GraphServiceClient<Request> graphClient = GraphServiceClient
        .builder()
        .authenticationProvider(authProvider)
        .buildClient();

List<User> allUsers = new LinkedList<>();
var usersPage = graphClient.users()
        .buildRequest()
        .get();

while (usersPage != null) {
    usersPage.getCurrentPage().forEach(allUsers::add);
    usersPage = usersPage.getNextPage() != null ?
usersPage.getNextPage().buildRequest().get() : null;
}

allUsers.forEach(user ->
        System.out.println("User: " + user.displayName + " | ID: " + user.id)
);

现在,我需要过滤这些用户以仅检索与我的公司名称相关的用户,例如“XiaoZCorp”,其过滤器如下:

var usersPage = graphClient.users()
        .buildRequest()
        .filter("companyName eq 'XiaoZCorp'") // This line throws an error
        .get();

但是,我收到此错误:

java: cannot find symbol
  symbol:   method filter(java.lang.String)
  location: class com.microsoft.graph.requests.UserCollectionRequestBuilder

如何使用 Java SDK 中的 Microsoft Graph API 按公司名称正确过滤用户?

azure azure-service-principal azure-java-sdk
1个回答
0
投票

最初,我注册了一个应用程序并授予了

User.Read.All
Application 类型的权限,如下所示:

enter image description here

我在 Azure 门户中有以下用户,公司名称为“MSFT”:

enter image description here

要使用 Microsoft Graph Java SDK 获取这些用户详细信息,您可以使用以下示例代码:

package org.example;

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.requests.GraphServiceClient;
import com.microsoft.graph.requests.UserCollectionPage;
import com.microsoft.graph.requests.UserCollectionRequestBuilder;
import com.microsoft.graph.requests.UserCollectionRequest;
import com.microsoft.graph.options.QueryOption;

import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        String clientId = "appId";
        String clientSecret = "secret";
        String tenantId = "tenantId";

        ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .clientSecret(clientSecret)
                .tenantId(tenantId)
                .build();

        TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(
                Collections.singletonList("https://graph.microsoft.com/.default"),
                clientSecretCredential
        );

        GraphServiceClient graphClient = GraphServiceClient
                .builder()
                .authenticationProvider(authProvider)
                .buildClient();

        UserCollectionRequestBuilder requestBuilder = graphClient.users();

        UserCollectionRequest request = requestBuilder
                .buildRequest()
                .select("companyName,id,displayName")
                .filter("companyName eq 'MSFT'");

        // Add ConsistencyLevel header
        request.addHeader("ConsistencyLevel", "Eventual");

        // Add $count query parameter
        request.addQueryOption(new QueryOption("$count", "true"));

        UserCollectionPage result = request.get();

        // Print out the filtered users
        result.getCurrentPage().forEach(user ->
                System.out.println("User: " + user.displayName + " | ID: " + user.id)
        );
    }
}

回复:

enter image description here

确保添加

ConsistencyLevel : eventual
$count:true
标头,因为使用公司名称进行过滤需要 高级查询 功能。

参考:

使用 $filter 查询参数来筛选对象集合 - Microsoft Graph

© www.soinside.com 2019 - 2024. All rights reserved.