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

shaofengshi 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 ac575f524 [#5384] Added simple authentication to the Gravitino CLI 
(#5610)
ac575f524 is described below

commit ac575f5245c024a31658cfc994177106d9545aa5
Author: Justin Mclean <[email protected]>
AuthorDate: Thu Dec 5 14:55:44 2024 +1100

    [#5384] Added simple authentication to the Gravitino CLI (#5610)
    
    ### What changes were proposed in this pull request?
    
    Added simple authentication to the Gravitino CLI
    
    ### Why are the changes needed?
    
    To support authentication.
    
    Fix: #5384
    
    ### Does this PR introduce _any_ user-facing change?
    
    No, but adds authentication to the CLI.
    
    ### How was this patch tested?
    
    Tested locally.
---
 .../apache/gravitino/cli/GravitinoCommandLine.java | 92 +++++++++++++++++++++-
 .../org/apache/gravitino/cli/GravitinoConfig.java  | 18 ++++-
 .../org/apache/gravitino/cli/GravitinoOptions.java |  4 +
 .../apache/gravitino/cli/TestableCommandLine.java  |  8 +-
 .../gravitino/cli/commands/CatalogDetails.java     |  5 +-
 .../org/apache/gravitino/cli/commands/Command.java | 61 ++++++++++++--
 .../gravitino/cli/commands/MetalakeDetails.java    |  4 +-
 .../apache/gravitino/cli/TestCatalogCommands.java  |  2 +-
 .../apache/gravitino/cli/TestMetalakeCommands.java |  2 +-
 .../org/apache/gravitino/cli/TestTagCommands.java  |  2 +-
 docs/cli.md                                        | 32 +++++++-
 11 files changed, 206 insertions(+), 24 deletions(-)

diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
index 683efe9f3..1cfcb97f6 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
@@ -30,6 +30,7 @@ import java.util.Map;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Options;
+import org.apache.gravitino.cli.commands.Command;
 
 /* Gravitino Command line */
 public class GravitinoCommandLine extends TestableCommandLine {
@@ -43,6 +44,8 @@ public class GravitinoCommandLine extends TestableCommandLine 
{
   private boolean ignore = false;
   private String ignoreEnv;
   private boolean ignoreSet = false;
+  private String authEnv;
+  private boolean authSet = false;
 
   public static final String CMD = "gcli"; // recommended name
   public static final String DEFAULT_URL = "http://localhost:8090";;
@@ -151,15 +154,19 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleMetalakeCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String outputFormat = line.getOptionValue(GravitinoOptions.OUTPUT);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       if (line.hasOption(GravitinoOptions.AUDIT)) {
         newMetalakeAudit(url, ignore, metalake).handle();
       } else {
-        newMetalakeDetails(url, ignore, metalake, outputFormat).handle();
+        newMetalakeDetails(url, ignore, outputFormat, metalake).handle();
       }
     } else if (CommandActions.LIST.equals(command)) {
       newListMetalakes(url, ignore, outputFormat).handle();
@@ -196,10 +203,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleCatalogCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String outputFormat = line.getOptionValue(GravitinoOptions.OUTPUT);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.LIST.equals(command)) {
       newListCatalogs(url, ignore, metalake).handle();
       return;
@@ -211,7 +222,7 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
       if (line.hasOption(GravitinoOptions.AUDIT)) {
         newCatalogAudit(url, ignore, metalake, catalog).handle();
       } else {
-        newCatalogDetails(url, ignore, metalake, catalog, 
outputFormat).handle();
+        newCatalogDetails(url, ignore, outputFormat, metalake, 
catalog).handle();
       }
     } else if (CommandActions.CREATE.equals(command)) {
       String comment = line.getOptionValue(GravitinoOptions.COMMENT);
@@ -248,10 +259,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleSchemaCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String catalog = name.getCatalogName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.LIST.equals(command)) {
       newListSchema(url, ignore, metalake, catalog).handle();
       return;
@@ -288,11 +303,15 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleTableCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String catalog = name.getCatalogName();
     String schema = name.getSchemaName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.LIST.equals(command)) {
       newListTables(url, ignore, metalake, catalog, schema).handle();
       return;
@@ -345,10 +364,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
   /** Handles the command execution for Users based on command type and the 
command line options. */
   protected void handleUserCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String user = line.getOptionValue(GravitinoOptions.USER);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       newUserDetails(url, ignore, metalake, user).handle();
     } else if (CommandActions.LIST.equals(command)) {
@@ -376,10 +399,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
   /** Handles the command execution for Group based on command type and the 
command line options. */
   protected void handleGroupCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String group = line.getOptionValue(GravitinoOptions.GROUP);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       newGroupDetails(url, ignore, metalake, group).handle();
     } else if (CommandActions.LIST.equals(command)) {
@@ -407,9 +434,13 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
   /** Handles the command execution for Tags based on command type and the 
command line options. */
   protected void handleTagCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     String[] tags = line.getOptionValues(GravitinoOptions.TAG);
     if (tags != null) {
       tags = Arrays.stream(tags).distinct().toArray(String[]::new);
@@ -465,10 +496,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
   /** Handles the command execution for Roles based on command type and the 
command line options. */
   protected void handleRoleCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String role = line.getOptionValue(GravitinoOptions.ROLE);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       newRoleDetails(url, ignore, metalake, role).handle();
     } else if (CommandActions.LIST.equals(command)) {
@@ -486,6 +521,8 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleColumnCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String catalog = name.getCatalogName();
@@ -493,6 +530,8 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
     String table = name.getTableName();
     String column = name.getColumnName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.LIST.equals(command)) {
       newListColumns(url, ignore, metalake, catalog, schema, table).handle();
     } else if (CommandActions.CREATE.equals(command)) {
@@ -599,10 +638,14 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleOwnerCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String entityName = line.getOptionValue(GravitinoOptions.NAME);
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       newOwnerDetails(url, ignore, metalake, entityName, entity).handle();
     } else if (CommandActions.SET.equals(command)) {
@@ -626,12 +669,16 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleTopicCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String catalog = name.getCatalogName();
     String schema = name.getSchemaName();
     String topic = name.getTopicName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.LIST.equals(command)) {
       newListTopics(url, ignore, metalake, catalog, schema).handle();
     } else if (CommandActions.DETAILS.equals(command)) {
@@ -664,12 +711,16 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
    */
   private void handleFilesetCommand() {
     String url = getUrl();
+    String auth = getAuth();
+    String userName = line.getOptionValue(GravitinoOptions.LOGIN);
     FullName name = new FullName(line);
     String metalake = name.getMetalakeName();
     String catalog = name.getCatalogName();
     String schema = name.getSchemaName();
     String fileset = name.getFilesetName();
 
+    Command.setAuthenicationMode(auth, userName);
+
     if (CommandActions.DETAILS.equals(command)) {
       newFilesetDetails(url, ignore, metalake, catalog, schema, 
fileset).handle();
     } else if (CommandActions.LIST.equals(command)) {
@@ -742,4 +793,41 @@ public class GravitinoCommandLine extends 
TestableCommandLine {
     // Return the default localhost URL
     return DEFAULT_URL;
   }
+
+  /**
+   * Retrieves the Gravitinno authentication from the command line options or 
the GRAVITINO_AUTH
+   * environment variable or the Gravitio config file.
+   *
+   * @return The Gravitinno authentication, or null if not found.
+   */
+  public String getAuth() {
+
+    // If specified on the command line use that
+    if (line.hasOption(GravitinoOptions.SIMPLE)) {
+      return GravitinoOptions.SIMPLE;
+    }
+
+    // Cache the Gravitino URL environment variable
+    if (authEnv == null && !authSet) {
+      authEnv = System.getenv("GRAVITINO_AUTH");
+      authSet = true;
+    }
+
+    // If set return the Gravitino URL environment variable
+    if (authEnv != null) {
+      return authEnv;
+    }
+
+    // Check if the metalake name is specified in the configuration file
+    GravitinoConfig config = new GravitinoConfig(null);
+    if (config.fileExists()) {
+      config.read();
+      String configAuth = config.getGravitinoAuth();
+      if (configAuth != null) {
+        return configAuth;
+      }
+    }
+
+    return null;
+  }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java
index da837c21e..375073d2c 100644
--- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java
+++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java
@@ -36,6 +36,7 @@ public class GravitinoConfig {
   private String metalake;
   private String url;
   private boolean ignore;
+  private String authentication;
 
   /**
    * Creates a GravitinoConfig object with a specified config file. If no file 
is provided, it
@@ -62,13 +63,14 @@ public class GravitinoConfig {
   }
 
   /**
-   * Reads the configuration file and loads the 'metalake' and 'URL' 
properties. If the file is not
-   * found, it is ignored as the config file is optional.
+   * Reads the configuration file and loads the 'metalake', 'URL' and other 
properties. If the file
+   * is not found, it is ignored as the config file is optional.
    */
   public void read() {
     String metalakeKey = "metalake";
     String urlKey = "URL";
     String ignoreKey = "ignore";
+    String authKey = "auth";
     Properties prop = new Properties();
 
     try (FileInputStream stream = new FileInputStream(configFile)) {
@@ -89,6 +91,9 @@ public class GravitinoConfig {
     if (prop.containsKey(ignoreKey)) {
       ignore = prop.getProperty(ignoreKey).equals("true");
     }
+    if (prop.containsKey(authKey)) {
+      authentication = prop.getProperty(authKey);
+    }
   }
 
   /**
@@ -126,4 +131,13 @@ public class GravitinoConfig {
   public String getConfigFile() {
     return configFile;
   }
+
+  /**
+   * Retrieves the Gravitino authentication stored in the configuration.
+   *
+   * @return The Gravitino authentication or null if not set.
+   */
+  public String getGravitinoAuth() {
+    return authentication;
+  }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java
index fe09380d4..aa04fb2f8 100644
--- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java
+++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java
@@ -50,6 +50,8 @@ public class GravitinoOptions {
   public static final String ROLE = "role";
   public static final String AUDIT = "audit";
   public static final String FORCE = "force";
+  public static final String SIMPLE = "simple";
+  public static final String LOGIN = "login";
   public static final String COLUMNFILE = "columnfile";
   public static final String INDEX = "index";
   public static final String DISTRIBUTION = "distribution";
@@ -74,6 +76,8 @@ public class GravitinoOptions {
     options.addOption(createArgOption("m", METALAKE, "metalake name"));
     options.addOption(createSimpleOption("i", IGNORE, "ignore client/sever 
version check"));
     options.addOption(createSimpleOption("a", AUDIT, "display audit 
information"));
+    options.addOption(createSimpleOption(null, SIMPLE, "simple 
authentication"));
+    options.addOption(createArgOption(null, LOGIN, "user name"));
     options.addOption(createSimpleOption("x", INDEX, "display index 
information"));
     options.addOption(createSimpleOption("d", DISTRIBUTION, "display 
distribution information"));
     options.addOption(createSimpleOption(PARTITION, "display partition 
information"));
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
index ac285804e..47150fe8c 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
@@ -143,8 +143,8 @@ public class TestableCommandLine {
   }
 
   protected MetalakeDetails newMetalakeDetails(
-      String url, boolean ignore, String metalake, String outputFormat) {
-    return new MetalakeDetails(url, ignore, metalake, outputFormat);
+      String url, boolean ignore, String outputFormat, String metalake) {
+    return new MetalakeDetails(url, ignore, outputFormat, metalake);
   }
 
   protected ListMetalakes newListMetalakes(String url, boolean ignore, String 
outputFormat) {
@@ -192,8 +192,8 @@ public class TestableCommandLine {
   }
 
   protected CatalogDetails newCatalogDetails(
-      String url, boolean ignore, String metalake, String catalog, String 
outputFormat) {
-    return new CatalogDetails(url, ignore, metalake, catalog, outputFormat);
+      String url, boolean ignore, String outputFormat, String metalake, String 
catalog) {
+    return new CatalogDetails(url, ignore, outputFormat, metalake, catalog);
   }
 
   protected ListCatalogs newListCatalogs(String url, boolean ignore, String 
metalake) {
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java
 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java
index bebe536fa..3f0e758f4 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java
@@ -35,12 +35,13 @@ public class CatalogDetails extends Command {
    *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
+   * @param outputFormat The output format.
    * @param metalake The name of the metalake.
    * @param catalog The name of the catalog.
-   * @param outputFormat The output format.
    */
   public CatalogDetails(
-      String url, boolean ignoreVersions, String metalake, String catalog, 
String outputFormat) {
+      String url, boolean ignoreVersions, String outputFormat, String 
metalake, String catalog) {
+
     super(url, ignoreVersions, outputFormat);
     this.metalake = metalake;
     this.catalog = catalog;
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java
index 1753e5743..2bedc37a0 100644
--- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java
+++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java
@@ -19,6 +19,8 @@
 
 package org.apache.gravitino.cli.commands;
 
+import static org.apache.gravitino.client.GravitinoClientBase.Builder;
+
 import org.apache.gravitino.cli.outputs.PlainFormat;
 import org.apache.gravitino.cli.outputs.TableFormat;
 import org.apache.gravitino.client.GravitinoAdminClient;
@@ -33,6 +35,9 @@ public abstract class Command {
   public static String OUTPUT_FORMAT_TABLE = "table";
   public static String OUTPUT_FORMAT_PLAIN = "plain";
 
+  protected static String authentication = null;
+  protected static String userName = null;
+
   /**
    * Command constructor.
    *
@@ -40,15 +45,35 @@ public abstract class Command {
    * @param ignoreVersions If true don't check the client/server versions 
match.
    */
   public Command(String url, boolean ignoreVersions) {
-    this(url, ignoreVersions, null);
+    this.url = url;
+    this.ignoreVersions = ignoreVersions;
+    this.outputFormat = OUTPUT_FORMAT_PLAIN;
   }
 
+  /**
+   * Command constructor.
+   *
+   * @param url The URL of the Gravitino server.
+   * @param ignoreVersions If true don't check the client/server versions 
match.
+   * @param outputFormat output format used in some commands
+   */
   public Command(String url, boolean ignoreVersions, String outputFormat) {
     this.url = url;
     this.ignoreVersions = ignoreVersions;
     this.outputFormat = outputFormat;
   }
 
+  /**
+   * Sets the authentication mode and user credentials for the command.
+   *
+   * @param authentication the authentication mode to be used (e.g. "simple")
+   * @param userName the username associated with the authentication mode
+   */
+  public static void setAuthenicationMode(String authentication, String 
userName) {
+    Command.authentication = authentication;
+    Command.userName = userName;
+  }
+
   /** All commands have a handle method to handle and run the required 
command. */
   public abstract void handle();
 
@@ -60,11 +85,22 @@ public abstract class Command {
    * @throws NoSuchMetalakeException if the specified metalake does not exist.
    */
   protected GravitinoClient buildClient(String metalake) throws 
NoSuchMetalakeException {
+    Builder<GravitinoClient> client = 
GravitinoClient.builder(url).withMetalake(metalake);
+
     if (ignoreVersions) {
-      return 
GravitinoClient.builder(url).withMetalake(metalake).withVersionCheckDisabled().build();
-    } else {
-      return GravitinoClient.builder(url).withMetalake(metalake).build();
+      client = client.withVersionCheckDisabled();
+    }
+    if (authentication != null) {
+      if (authentication.equals("simple")) {
+        if (userName != null && !userName.isEmpty()) {
+          client = client.withSimpleAuth(userName);
+        } else {
+          client = client.withSimpleAuth();
+        }
+      }
     }
+
+    return client.build();
   }
 
   /**
@@ -73,11 +109,22 @@ public abstract class Command {
    * @return A configured {@link GravitinoAdminClient} instance.
    */
   protected GravitinoAdminClient buildAdminClient() {
+    Builder<GravitinoAdminClient> client = GravitinoAdminClient.builder(url);
+
     if (ignoreVersions) {
-      return 
GravitinoAdminClient.builder(url).withVersionCheckDisabled().build();
-    } else {
-      return GravitinoAdminClient.builder(url).build();
+      client = client.withVersionCheckDisabled();
     }
+    if (authentication != null) {
+      if (authentication.equals("simple")) {
+        if (userName != null && !userName.isEmpty()) {
+          client = client.withSimpleAuth(userName);
+        } else {
+          client = client.withSimpleAuth();
+        }
+      }
+    }
+
+    return client.build();
   }
 
   /**
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java
 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java
index 127b9a584..592317af4 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java
@@ -33,10 +33,10 @@ public class MetalakeDetails extends Command {
    *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
-   * @param metalake The name of the metalake.
    * @param outputFormat The output format.
+   * @param metalake The name of the metalake.
    */
-  public MetalakeDetails(String url, boolean ignoreVersions, String metalake, 
String outputFormat) {
+  public MetalakeDetails(String url, boolean ignoreVersions, String 
outputFormat, String metalake) {
     super(url, ignoreVersions, outputFormat);
     this.metalake = metalake;
   }
diff --git 
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java 
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
index c337a342c..10c25f8f8 100644
--- 
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
+++ 
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
@@ -82,7 +82,7 @@ class TestCatalogCommands {
     doReturn(mockDetails)
         .when(commandLine)
         .newCatalogDetails(
-            GravitinoCommandLine.DEFAULT_URL, false, "metalake_demo", 
"catalog", null);
+            GravitinoCommandLine.DEFAULT_URL, false, null, "metalake_demo", 
"catalog");
     commandLine.handleCommandLine();
     verify(mockDetails).handle();
   }
diff --git 
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMetalakeCommands.java 
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMetalakeCommands.java
index 2b94a80a9..b7468b635 100644
--- 
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMetalakeCommands.java
+++ 
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMetalakeCommands.java
@@ -78,7 +78,7 @@ class TestMetalakeCommands {
                 mockCommandLine, mockOptions, CommandEntities.METALAKE, 
CommandActions.DETAILS));
     doReturn(mockDetails)
         .when(commandLine)
-        .newMetalakeDetails(GravitinoCommandLine.DEFAULT_URL, false, 
"metalake_demo", null);
+        .newMetalakeDetails(GravitinoCommandLine.DEFAULT_URL, false, null, 
"metalake_demo");
     commandLine.handleCommandLine();
     verify(mockDetails).handle();
   }
diff --git 
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestTagCommands.java 
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestTagCommands.java
index 91a809fbc..ebf87bbba 100644
--- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestTagCommands.java
+++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestTagCommands.java
@@ -74,7 +74,7 @@ class TestTagCommands {
   }
 
   @Test
-  void testMetalakeDetailsCommand() {
+  void testTagDetailsCommand() {
     TagDetails mockDetails = mock(TagDetails.class);
     
when(mockCommandLine.hasOption(GravitinoOptions.METALAKE)).thenReturn(true);
     
when(mockCommandLine.getOptionValue(GravitinoOptions.METALAKE)).thenReturn("metalake_demo");
diff --git a/docs/cli.md b/docs/cli.md
index 825267b50..c8702ce11 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -42,6 +42,7 @@ The general structure for running commands with the Gravitino 
CLI is `gcli entit
  -h,--help               command help information
  -i,--ignore             ignore client/sever version check
  -l,--user <arg>         user name
+    --login <arg>        user name
  -m,--metalake <arg>     metalake name
  -n,--name <arg>         full entity name (dot separated)
     --null <arg>         column value can be null (true/false)
@@ -54,6 +55,8 @@ The general structure for running commands with the Gravitino 
CLI is `gcli entit
  -r,--role <arg>         role name
     --rename <arg>       new entity name
  -s,--server             Gravitino server version
+    --simple             simple authentication
+    --sortorder          display sortorder information
  -t,--tag <arg>          tag name
  -u,--url <arg>          Gravitino URL (default: http://localhost:8090)
  -v,--version            Gravitino client version
@@ -96,6 +99,14 @@ As you need to set the Gravitino URL for every command, you 
can set the URL in s
 
 The command line option overrides the environment variable and the environment 
variable overrides the configuration file.
 
+### Setting the Gravitino Authentication Type
+
+The authentication type can also be set in several ways.
+
+1. Passed in on the command line via the `--simple` flag.
+2. Set via the 'GRAVITINO_AUTH' environment variable.
+3. Stored in the Gravitino CLI configuration file.
+
 ### Gravitino CLI configuration file
 
 The gravitino CLI can read commonly used CLI options from a configuration 
file. By default, the file is `.gravitino` in the user's home directory. The 
metalake, URL and ignore parameters can be set in this file.
@@ -114,6 +125,9 @@ URL=http://localhost:8090
 # Ignore client/server version mismatch
 ignore=true
 
+# Authentication
+auth=simple
+
 ```
 
 ### Potentially unsafe operations
@@ -773,7 +787,7 @@ gcli fileset set  --name hadoop.schema.fileset --property 
test --value value
 gcli fileset remove --name hadoop.schema.fileset --property test
 ```
 
-### column commands
+### Column commands
 
 Note that some commands are not supported depending on what the database 
supports.
 
@@ -803,5 +817,19 @@ gcli  column delete --name 
catalog_postgres.hr.departments.money
 gcli column update --name catalog_postgres.hr.departments.value --rename values
 gcli column update --name catalog_postgres.hr.departments.values --datatype 
"varchar(500)"
 gcli column update --name catalog_postgres.hr.departments.values --position 
name
-gcli column update --name catalog_postgres.hr.departments.name --null=true
+gcli column update --name catalog_postgres.hr.departments.name --null true
+```
+
+#### Simple authentication
+
+```bash
+gcli <normal command> --simple
+```
+
+### Authentication
+
+#### Simple authentication with user name
+
+```bash
+gcli <normal command> --simple --login userName
 ```
\ No newline at end of file

Reply via email to