This is an automated email from the ASF dual-hosted git repository.

yuqi4733 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 858e54348 [#3807] feat(client-java): SimpleAuth can add a username 
when build a GravitinoClient (#3866)
858e54348 is described below

commit 858e54348d03072d6ea5aaabdf092f4a2e6f3cfb
Author: mygrsun <[email protected]>
AuthorDate: Thu Aug 22 19:05:19 2024 +0800

    [#3807] feat(client-java): SimpleAuth can add a username when build a 
GravitinoClient (#3866)
    
    ### What changes were proposed in this pull request?
    
    1.withSimpleAuth add user name as parameter to build simple auth
    GravitinoClient
    
    ### Why are the changes needed?
    
    fix the https://github.com/datastrato/gravitino/issues/3807
    
    Fix: #3807
    
    ### Does this PR introduce _any_ user-facing change?
    
    (Please list the user-facing changes introduced by your change,
    including
    no
    
    ### How was this patch tested?
    
    ---------
    
    Co-authored-by: ericqin <[email protected]>
---
 .../gravitino/client/GravitinoClientBase.java      | 14 +++++++++++++
 .../gravitino/client/SimpleTokenProvider.java      | 11 +++++++++-
 .../client/TestGravitinoClientBuilder.java         | 24 ++++++++++++++++++++++
 docs/security/how-to-authenticate.md               |  9 ++++++++
 4 files changed, 57 insertions(+), 1 deletion(-)

diff --git 
a/clients/client-java/src/main/java/org/apache/gravitino/client/GravitinoClientBase.java
 
b/clients/client-java/src/main/java/org/apache/gravitino/client/GravitinoClientBase.java
index fbed4c3c9..649f5cc6b 100644
--- 
a/clients/client-java/src/main/java/org/apache/gravitino/client/GravitinoClientBase.java
+++ 
b/clients/client-java/src/main/java/org/apache/gravitino/client/GravitinoClientBase.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.client;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.errorprone.annotations.InlineMe;
 import java.io.Closeable;
@@ -28,6 +29,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.Version;
@@ -226,6 +228,18 @@ public abstract class GravitinoClientBase implements 
Closeable {
       return this;
     }
 
+    /**
+     * Sets the simple mode authentication for Gravitino with a specific 
username
+     *
+     * @param userName The username of the user.
+     * @return This Builder instance for method chaining.
+     */
+    public Builder<T> withSimpleAuth(String userName) {
+      Preconditions.checkArgument(StringUtils.isNotBlank(userName), "userName 
can't be blank");
+      this.authDataProvider = new SimpleTokenProvider(userName);
+      return this;
+    }
+
     /**
      * Optional, set a flag to verify the client is supported to connector the 
server
      *
diff --git 
a/clients/client-java/src/main/java/org/apache/gravitino/client/SimpleTokenProvider.java
 
b/clients/client-java/src/main/java/org/apache/gravitino/client/SimpleTokenProvider.java
index ed416788b..969708f10 100644
--- 
a/clients/client-java/src/main/java/org/apache/gravitino/client/SimpleTokenProvider.java
+++ 
b/clients/client-java/src/main/java/org/apache/gravitino/client/SimpleTokenProvider.java
@@ -37,13 +37,22 @@ final class SimpleTokenProvider implements AuthDataProvider 
{
     if (gravitinoUser == null) {
       gravitinoUser = System.getProperty("user.name");
     }
+    this.token = buildToken(gravitinoUser);
+  }
+
+  public SimpleTokenProvider(String gravitinoUser) {
+    this.token = buildToken(gravitinoUser);
+  }
+
+  private byte[] buildToken(String gravitinoUser) {
     String userInformation = gravitinoUser + ":dummy";
-    this.token =
+    byte[] token =
         (AuthConstants.AUTHORIZATION_BASIC_HEADER
                 + new String(
                     
Base64.getEncoder().encode(userInformation.getBytes(StandardCharsets.UTF_8)),
                     StandardCharsets.UTF_8))
             .getBytes(StandardCharsets.UTF_8);
+    return token;
   }
 
   @Override
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/TestGravitinoClientBuilder.java
 
b/clients/client-java/src/test/java/org/apache/gravitino/client/TestGravitinoClientBuilder.java
index da5ecfe8b..a2dc36c47 100644
--- 
a/clients/client-java/src/test/java/org/apache/gravitino/client/TestGravitinoClientBuilder.java
+++ 
b/clients/client-java/src/test/java/org/apache/gravitino/client/TestGravitinoClientBuilder.java
@@ -41,12 +41,31 @@ public class TestGravitinoClientBuilder {
       Assertions.assertEquals(ImmutableMap.of(), client1.getHeaders());
     }
   }
+
+  @Test
+  public void testGravitinoClientSimpleAuthWithUserName() {
+    String userName = "test_user";
+    try (MockGravitinoClient client =
+        
MockGravitinoClient.builder("http://127.0.0.1";).withSimpleAuth(userName).build())
 {
+      Assertions.assertArrayEquals(
+          new SimpleTokenProvider(userName).getTokenData(),
+          client.getAuthDataProvider().getTokenData());
+    }
+
+    try (MockGravitinoClient client =
+        
MockGravitinoClient.builder("http://127.0.0.1";).withSimpleAuth().build()) {
+      Assertions.assertArrayEquals(
+          new SimpleTokenProvider().getTokenData(), 
client.getAuthDataProvider().getTokenData());
+    }
+  }
 }
 
 class MockGravitinoClient extends GravitinoClientBase {
 
   private Map<String, String> headers;
 
+  private AuthDataProvider authDataProvider;
+
   /**
    * Constructs a new GravitinoClient with the given URI, authenticator and 
AuthDataProvider.
    *
@@ -58,12 +77,17 @@ class MockGravitinoClient extends GravitinoClientBase {
       String uri, AuthDataProvider authDataProvider, Map<String, String> 
headers) {
     super(uri, authDataProvider, false, headers);
     this.headers = headers;
+    this.authDataProvider = authDataProvider;
   }
 
   Map<String, String> getHeaders() {
     return headers;
   }
 
+  AuthDataProvider getAuthDataProvider() {
+    return authDataProvider;
+  }
+
   /**
    * Creates a new builder for constructing a GravitinoClient.
    *
diff --git a/docs/security/how-to-authenticate.md 
b/docs/security/how-to-authenticate.md
index 41b620353..c98676350 100644
--- a/docs/security/how-to-authenticate.md
+++ b/docs/security/how-to-authenticate.md
@@ -24,6 +24,15 @@ GravitinoClient client = GravitinoClient.builder(uri)
     .build();
 ```
 
+Additionally, the username can be directly used as a parameter to create a 
client.
+
+```java
+GravitinoClient client = GravitinoClient.builder(uri)
+    .withMetalake("metalake")
+    .withSimpleAuth("test_user_name")
+    .build();
+```
+
 ### OAuth mode
 
 Gravitino only supports external OAuth 2.0 servers. To enable OAuth mode, 
users should follow the steps below.

Reply via email to