azureazure-service-principalazure-java-sdk

How to filter users in directory by company name with Microsoft Graph Java SDK?


I'm working with Microsoft Graph API to get users from my organisation. Here's what I have so far that fetches all users:

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)
);

Now, I need to filter these users to retrieve only those associated with my company name, like "XiaoZCorp" with filter like this:

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

However, I’m getting this error:

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

How can I properly filter users by company name using Microsoft Graph API in Java SDK?


Solution

  • Initially, I registered one application and granted User.Read.All permission of Application type as below:

    enter image description here

    I have below users in Azure Portal with company name 'MSFT' in my case:

    enter image description here

    To get these user details using Microsoft Graph Java SDK, you can make use of below sample code:

    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)
            );
        }
    }
    

    Response:

    enter image description here

    Make sure to add ConsistencyLevel : eventual and $count:true headers as filtering with company name requires advanced query capability.

    Reference:

    Use the $filter query parameter to filter a collection of objects - Microsoft Graph