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

mchades pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.3 by this push:
     new db207f3882 [Cherry-pick to branch-1.3] [#11443] feat(auth): Add Basic 
auth support for Spark, Flink, and Trino connectors (#11457) (#11531)
db207f3882 is described below

commit db207f38829ceff22c4dfd395c7d08bdf1bb4dcb
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Jun 10 16:06:53 2026 +0800

    [Cherry-pick to branch-1.3] [#11443] feat(auth): Add Basic auth support for 
Spark, Flink, and Trino connectors (#11457) (#11531)
    
    **Cherry-pick Information:**
    - Original commit: d7fe5f51953e617b9eb8657f273669efcf870506
    - Target branch: `branch-1.3`
    - Status: ✅ Clean cherry-pick (no conflicts)
    
    ---------
    
    Co-authored-by: MaSai <[email protected]>
    Co-authored-by: Cursor <[email protected]>
    Co-authored-by: Qi Yu <[email protected]>
    Co-authored-by: yuqi <[email protected]>
---
 .../org/apache/gravitino/auth/AuthProperties.java  |  11 +++
 clients/client-java/build.gradle.kts               |   1 +
 .../test/authorization/BasicAuthOperationsIT.java  |  80 ++++++++++++++++
 .../flink-authentication-with-gravitino.md         |  45 ++++++---
 .../spark-authentication-with-gravitino.md         |  45 ++++++---
 docs/trino-connector/authentication.md             |  72 ++++++++++-----
 docs/trino-connector/configuration.md              |   2 +-
 .../connector/catalog/GravitinoCatalogManager.java |  33 ++++++-
 .../store/GravitinoCatalogStoreFactoryOptions.java |   5 +
 .../TestGravitinoCatalogManagerBasicAuth.java      | 101 +++++++++++++++++++++
 .../spark/connector/GravitinoSparkConfig.java      |   4 +
 .../connector/plugin/GravitinoDriverPlugin.java    |  16 +++-
 .../plugin/TestGravitinoSparkBasicAuth.java        | 100 ++++++++++++++++++++
 .../connector/security/GravitinoAuthProvider.java  |  33 ++++++-
 .../security/TestGravitinoAuthProvider.java        |  58 ++++++++++++
 15 files changed, 558 insertions(+), 48 deletions(-)

diff --git 
a/catalogs/catalog-common/src/main/java/org/apache/gravitino/auth/AuthProperties.java
 
b/catalogs/catalog-common/src/main/java/org/apache/gravitino/auth/AuthProperties.java
index 2984ee2ba0..160b9d29b5 100644
--- 
a/catalogs/catalog-common/src/main/java/org/apache/gravitino/auth/AuthProperties.java
+++ 
b/catalogs/catalog-common/src/main/java/org/apache/gravitino/auth/AuthProperties.java
@@ -25,9 +25,16 @@ public class AuthProperties {
   public static final String GRAVITINO_CLIENT_AUTH_TYPE = "authType";
 
   public static final String SIMPLE_AUTH_TYPE = "simple";
+  public static final String BASIC_AUTH_TYPE = "basic";
   public static final String OAUTH2_AUTH_TYPE = "oauth2";
   public static final String KERBEROS_AUTH_TYPE = "kerberos";
 
+  /** The configuration key for the built-in IdP username used in Basic 
authentication. */
+  public static final String GRAVITINO_BASIC_USERNAME = "basic.username";
+
+  /** The configuration key for the built-in IdP password used in Basic 
authentication. */
+  public static final String GRAVITINO_BASIC_PASSWORD = "basic.password";
+
   // oauth2
   /** The configuration key for the URI of the default OAuth server. */
   public static final String GRAVITINO_OAUTH2_SERVER_URI = "oauth2.serverUri";
@@ -53,5 +60,9 @@ public class AuthProperties {
     return authType == null || SIMPLE_AUTH_TYPE.equalsIgnoreCase(authType);
   }
 
+  public static boolean isBasic(String authType) {
+    return BASIC_AUTH_TYPE.equalsIgnoreCase(authType);
+  }
+
   private AuthProperties() {}
 }
diff --git a/clients/client-java/build.gradle.kts 
b/clients/client-java/build.gradle.kts
index b3850d71fe..cf13fa07ed 100644
--- a/clients/client-java/build.gradle.kts
+++ b/clients/client-java/build.gradle.kts
@@ -44,6 +44,7 @@ dependencies {
 
   testImplementation(project(":core"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
+  testImplementation(project(":plugins:idp-basic"))
   testImplementation(project(":server"))
   testImplementation(project(":server-common"))
 
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/BasicAuthOperationsIT.java
 
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/BasicAuthOperationsIT.java
new file mode 100644
index 0000000000..5d6242a20e
--- /dev/null
+++ 
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/BasicAuthOperationsIT.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.client.integration.test.authorization;
+
+import static org.apache.gravitino.integration.test.util.BaseIT.setEnv;
+
+import com.google.common.collect.Maps;
+import java.io.IOException;
+import java.util.Map;
+import org.apache.gravitino.Configs;
+import org.apache.gravitino.client.GravitinoAdminClient;
+import org.apache.gravitino.client.GravitinoVersion;
+import org.apache.gravitino.idp.auth.BasicAuthenticator;
+import org.apache.gravitino.idp.web.rest.feature.IdpRESTFeature;
+import org.apache.gravitino.integration.test.util.BaseIT;
+import org.apache.gravitino.integration.test.util.ITUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+/** Integration tests for Gravitino client HTTP Basic authentication against 
the REST server. */
+public class BasicAuthOperationsIT extends BaseIT {
+
+  private static final String ADMIN = "admin";
+  private static final String ADMIN_PASSWORD = "Passw0rd-For-Admin1";
+
+  public void setGravitinoAdminClient(GravitinoAdminClient client) {
+    this.client = client;
+  }
+
+  @BeforeAll
+  public void startIntegrationTest() throws Exception {
+    setEnv(IdpRESTFeature.INITIAL_ADMIN_PASSWORD_ENV, ADMIN_PASSWORD);
+    Map<String, String> configs = Maps.newHashMap();
+    configs.put(Configs.ENABLE_AUTHORIZATION.getKey(), String.valueOf(false));
+    configs.put(Configs.CACHE_ENABLED.getKey(), String.valueOf(false));
+    configs.put(Configs.STORE_DELETE_AFTER_TIME.getKey(), String.valueOf(20 * 
60 * 1000L));
+    configs.put(Configs.SERVICE_ADMINS.getKey(), ADMIN);
+    configs.put(Configs.AUTHENTICATORS.getKey(), 
BasicAuthenticator.class.getCanonicalName());
+    configs.put(
+        Configs.REST_API_EXTENSION_PACKAGES.getKey(), 
IdpRESTFeature.IDP_REST_EXTENSION_PACKAGE);
+    registerCustomConfigs(configs);
+    super.startIntegrationTest();
+
+    client = GravitinoAdminClient.builder(serverUri).withBasicAuth(ADMIN, 
ADMIN_PASSWORD).build();
+  }
+
+  @AfterAll
+  public void stopIntegrationTest() throws IOException, InterruptedException {
+    super.stopIntegrationTest();
+  }
+
+  @Test
+  public void testAuthenticationApi() throws Exception {
+    GravitinoVersion gravitinoVersion = client.serverVersion();
+    Assertions.assertEquals(System.getenv("PROJECT_VERSION"), 
gravitinoVersion.version());
+    Assertions.assertFalse(gravitinoVersion.compileDate().isEmpty());
+    if (testMode.equals(ITUtils.EMBEDDED_TEST_MODE)) {
+      final String gitCommitId = readGitCommitIdFromGitFile();
+      Assertions.assertEquals(gitCommitId, gravitinoVersion.gitCommit());
+    }
+  }
+}
diff --git a/docs/flink-connector/flink-authentication-with-gravitino.md 
b/docs/flink-connector/flink-authentication-with-gravitino.md
index 72eae72797..a7f627c5ea 100644
--- a/docs/flink-connector/flink-authentication-with-gravitino.md
+++ b/docs/flink-connector/flink-authentication-with-gravitino.md
@@ -1,17 +1,17 @@
 ---
 title: "Flink Authentication"
 slug: "/flink-connector/flink-authentication"
-keyword: "flink connector authentication oauth2 kerberos"
+keyword: "flink connector authentication basic oauth2 kerberos"
 license: "This software is licensed under the Apache License version 2."
 ---
 
 ## Overview
 
-Flink connector supports `simple`, `oauth2`, and `kerberos` authentication 
when accessing the Gravitino server.
+Flink connector supports `simple`, `basic`, `oauth2`, and `kerberos` 
authentication when accessing the Gravitino server.
 
-| Property                                                  | Type   | Default 
Value | Description                                                             
                                                                   | Required | 
Since Version |
-|-----------------------------------------------------------|--------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------|
-| table.catalog-store.gravitino.gravitino.client.auth.type  | string | (none)  
      | When explicitly set, only `oauth` is supported. If unset, Flink selects 
Kerberos or simple authentication based on its security settings.  | No       | 
1.2.0         |
+| Property                                                   | Type     | 
Default Value   | Description                                                   
                                                                             | 
Required   | Since Version   |
+|------------------------------------------------------------|----------|-----------------|--------------------------------------------------------------------------------------------------------------------------------------------|------------|-----------------|
+| table.catalog-store.gravitino.gravitino.client.auth.type   | string   | 
(none)          | When explicitly set, only `oauth2` and `basic` are supported. 
                                                                             | 
No         | 1.2.0           |
 
 ## Simple Mode
 
@@ -19,16 +19,39 @@ In simple mode, the username originates from Flink. The 
resolution order is:
 1. `HADOOP_USER_NAME` environment variable
 2. The logged-in OS user
 
+## Basic Mode
+
+In Basic mode, the Flink connector authenticates to the Gravitino server using 
HTTP Basic credentials
+against the built-in IDP. The Gravitino server must have Basic authentication 
enabled. See
+[How to authenticate](../security/how-to-authenticate.md#basic-mode) for 
server-side setup.
+
+| Property                                                                | 
Type     | Default Value   | Description                                        
| Required                         | Since Version   |
+|-------------------------------------------------------------------------|----------|-----------------|----------------------------------------------------|----------------------------------|-----------------|
+| table.catalog-store.gravitino.gravitino.client.auth.type                | 
string   | (none)          | Set to `basic` to enable Basic authentication.     
| Yes, for Basic mode              | 1.3.0           |
+| table.catalog-store.gravitino.gravitino.client.basic.username           | 
string   | (none)          | The built-in IDP username.                         
| Yes, for Basic mode              | 1.3.0           |
+| table.catalog-store.gravitino.gravitino.client.basic.password           | 
string   | (none)          | The built-in IDP password.                         
| Yes, for Basic mode              | 1.3.0           |
+
+### Basic Configuration Example
+
+```yaml
+table.catalog-store.kind: gravitino
+table.catalog-store.gravitino.gravitino.uri: http://localhost:8090
+table.catalog-store.gravitino.gravitino.metalake: my_metalake
+table.catalog-store.gravitino.gravitino.client.auth.type: basic
+table.catalog-store.gravitino.gravitino.client.basic.username: admin
+table.catalog-store.gravitino.gravitino.client.basic.password: 
YourSecureGravitinoPassword
+```
+
 ## OAuth2 Mode
 
 In OAuth2 mode, configure the following settings to fetch an OAuth2 token to 
access the Gravitino server:
 
-| Property                                                              | Type 
  | Default Value | Description                                      | Required 
                      | Since Version |
-|-----------------------------------------------------------------------|--------|---------------|--------------------------------------------------|--------------------------------|---------------|
-| table.catalog-store.gravitino.gravitino.client.oauth2.serverUri       | 
string | (none)        | The OAuth2 server URI.                           | 
Yes, for OAuth2 mode           | 1.2.0         |
-| table.catalog-store.gravitino.gravitino.client.oauth2.tokenPath       | 
string | (none)        | The token endpoint path on the OAuth2 server.    | 
Yes, for OAuth2 mode           | 1.2.0         |
-| table.catalog-store.gravitino.gravitino.client.oauth2.credential      | 
string | (none)        | The credential used to request the OAuth2 token. | 
Yes, for OAuth2 mode           | 1.2.0         |
-| table.catalog-store.gravitino.gravitino.client.oauth2.scope           | 
string | (none)        | The scope used to request the OAuth2 token.      | 
Yes, for OAuth2 mode           | 1.2.0         |
+| Property                                                                | 
Type     | Default Value   | Description                                        
| Required                         | Since Version   |
+|-------------------------------------------------------------------------|----------|-----------------|----------------------------------------------------|----------------------------------|-----------------|
+| table.catalog-store.gravitino.gravitino.client.oauth2.serverUri         | 
string   | (none)          | The OAuth2 server URI.                             
| Yes, for OAuth2 mode             | 1.2.0           |
+| table.catalog-store.gravitino.gravitino.client.oauth2.tokenPath         | 
string   | (none)          | The token endpoint path on the OAuth2 server.      
| Yes, for OAuth2 mode             | 1.2.0           |
+| table.catalog-store.gravitino.gravitino.client.oauth2.credential        | 
string   | (none)          | The credential used to request the OAuth2 token.   
| Yes, for OAuth2 mode             | 1.2.0           |
+| table.catalog-store.gravitino.gravitino.client.oauth2.scope             | 
string   | (none)          | The scope used to request the OAuth2 token.        
| Yes, for OAuth2 mode             | 1.2.0           |
 
 ### OAuth2 Configuration Example
 
diff --git a/docs/spark-connector/spark-authentication-with-gravitino.md 
b/docs/spark-connector/spark-authentication-with-gravitino.md
index 4b13cb7be0..7d46958c91 100644
--- a/docs/spark-connector/spark-authentication-with-gravitino.md
+++ b/docs/spark-connector/spark-authentication-with-gravitino.md
@@ -1,17 +1,17 @@
 ---
 title: "Spark Authentication"
 slug: "/spark-connector/spark-authentication"
-keyword: "spark connector authentication oauth2 kerberos"
+keyword: "spark connector authentication basic oauth2 kerberos"
 license: "This software is licensed under the Apache License version 2."
 ---
 
 ## Overview
 
-Spark connector supports `simple` `oauth2` and `kerberos` authentication when 
accessing Gravitino server.
+Spark connector supports `simple`, `basic`, `oauth2`, and `kerberos` 
authentication when accessing Gravitino server.
 
-| Property                     | Type   | Default Value | Description          
                                                                                
                       | Required | Since Version    |
-|------------------------------|--------|---------------|-----------------------------------------------------------------------------------------------------------------------------|----------|------------------|
-| spark.sql.gravitino.authType | string | `simple`      | The authentication 
mechanism for communicating with the Gravitino server. Supported values: 
`simple`, `oauth2`, `kerberos`. | No       | 0.7.0-incubating |
+| Property                       | Type     | Default Value   | Description    
                                                                                
                                      | Required   | Since Version      |
+|--------------------------------|----------|-----------------|--------------------------------------------------------------------------------------------------------------------------------------|------------|--------------------|
+| spark.sql.gravitino.authType   | string   | `simple`        | The 
authentication mechanism for communicating with the Gravitino server. Supported 
values: `simple`, `basic`, `oauth2`, `kerberos`. | No         | 
0.7.0-incubating   |
 
 ## Simple Mode
 
@@ -20,16 +20,39 @@ In the simple mode, the username originates from Spark, and 
is obtained using th
 2. The environment variable of `HADOOP_USER_NAME`
 3. The user login in the machine
 
+## Basic Mode
+
+In Basic mode, the Spark connector authenticates to the Gravitino server using 
HTTP Basic credentials
+against the built-in IDP. The Gravitino server must have Basic authentication 
enabled. See
+[How to authenticate](../security/how-to-authenticate.md#basic-mode) for 
server-side setup.
+
+| Property                                | Type     | Default Value   | 
Description                                     | Required               | 
Since Version      |
+|-----------------------------------------|----------|-----------------|-------------------------------------------------|------------------------|--------------------|
+| spark.sql.gravitino.authType            | string   | `simple`        | Set 
to `basic` to enable Basic authentication.  | Yes, for Basic mode    | 1.3.0    
          |
+| spark.sql.gravitino.basic.username      | string   | (none)          | The 
built-in IDP username.                      | Yes, for Basic mode    | 1.3.0    
          |
+| spark.sql.gravitino.basic.password      | string   | (none)          | The 
built-in IDP password.                      | Yes, for Basic mode    | 1.3.0    
          |
+
+### Basic Configuration Example
+
+```properties
+spark.plugins=org.apache.gravitino.spark.connector.plugin.GravitinoSparkPlugin
+spark.sql.gravitino.uri=http://localhost:8090
+spark.sql.gravitino.metalake=my_metalake
+spark.sql.gravitino.authType=basic
+spark.sql.gravitino.basic.username=admin
+spark.sql.gravitino.basic.password=YourSecureGravitinoPassword
+```
+
 ## OAuth2 Mode
 
 In the OAuth2 mode, you could use the following configuration to fetch an 
OAuth2 token to access Gravitino server.
 
-| Property                              | Type   | Default Value | Description 
                                  | Required             | Since Version    |
-|---------------------------------------|--------|---------------|-----------------------------------------------|----------------------|------------------|
-| spark.sql.gravitino.oauth2.serverUri  | string | None          | The OAuth2 
server uri address.                | Yes, for OAuth2 mode | 0.7.0-incubating |
-| spark.sql.gravitino.oauth2.tokenPath  | string | None          | The path of 
token interface in OAuth2 server. | Yes, for OAuth2 mode | 0.7.0-incubating |
-| spark.sql.gravitino.oauth2.credential | string | None          | The 
credential to request the OAuth2 token.   | Yes, for OAuth2 mode | 
0.7.0-incubating |
-| spark.sql.gravitino.oauth2.scope      | string | None          | The scope 
to request the OAuth2 token.        | Yes, for OAuth2 mode | 0.7.0-incubating |
+| Property                                | Type     | Default Value   | 
Description                                     | Required               | 
Since Version      |
+|-----------------------------------------|----------|-----------------|-------------------------------------------------|------------------------|--------------------|
+| spark.sql.gravitino.oauth2.serverUri    | string   | None            | The 
OAuth2 server uri address.                  | Yes, for OAuth2 mode   | 
0.7.0-incubating   |
+| spark.sql.gravitino.oauth2.tokenPath    | string   | None            | The 
path of token interface in OAuth2 server.   | Yes, for OAuth2 mode   | 
0.7.0-incubating   |
+| spark.sql.gravitino.oauth2.credential   | string   | None            | The 
credential to request the OAuth2 token.     | Yes, for OAuth2 mode   | 
0.7.0-incubating   |
+| spark.sql.gravitino.oauth2.scope        | string   | None            | The 
scope to request the OAuth2 token.          | Yes, for OAuth2 mode   | 
0.7.0-incubating   |
 
 ## Kerberos Mode
 
diff --git a/docs/trino-connector/authentication.md 
b/docs/trino-connector/authentication.md
index c317486971..9b966e2e75 100644
--- a/docs/trino-connector/authentication.md
+++ b/docs/trino-connector/authentication.md
@@ -7,7 +7,7 @@ license: "This software is licensed under the Apache License 
version 2."
 
 ## Introduction
 
-The Gravitino Trino connector supports authenticating to the Gravitino server 
using the same authentication mechanisms as the Gravitino Java client: Simple, 
OAuth2, and Kerberos. Authentication is configured through the Trino connector 
properties file using the `gravitino.client.*` prefix.
+The Gravitino Trino connector supports authenticating to the Gravitino server 
using the same authentication mechanisms as the Gravitino Java client: Simple, 
Basic, OAuth2, and Kerberos. Authentication is configured through the Trino 
connector properties file using the `gravitino.client.*` prefix.
 
 If `gravitino.client.authType` is not set, the connector operates in 
no-authentication mode and connects to the Gravitino server without any 
credentials.
 
@@ -29,10 +29,37 @@ gravitino.user=admin
 
 **Configuration properties:**
 
-| Property                          | Description                              
                            | Default value    | Required                       
        | Since version |
-|-----------------------------------|----------------------------------------------------------------------|------------------|----------------------------------------|---------------|
-| `gravitino.client.authType`       | Authentication type: `simple`, `oauth2`, 
or `kerberos`                 | (none)        | No                              
       | 1.3.0         |
-| `gravitino.user`                  | Username for simple authentication       
                            | (none)           | No (uses system user if not 
specified) | 1.3.0         |
+| Property                      | Description                                  
                       | Default value   | Required                             
    | Since version   |
+|-------------------------------|---------------------------------------------------------------------|-----------------|------------------------------------------|-----------------|
+| `gravitino.client.authType`   | Authentication type: `simple`, `basic`, 
`oauth2`, or `kerberos`     | (none)          | No                              
         | 1.3.0           |
+| `gravitino.user`              | Username for simple authentication           
                       | (none)          | No (uses system user if not 
specified)   | 1.3.0           |
+
+### Basic Authentication
+
+Basic authentication uses HTTP Basic credentials against the Gravitino 
built-in IDP. The Gravitino
+server must have Basic authentication enabled. See
+[How to authenticate](../security/how-to-authenticate.md#basic-mode) for 
server-side setup.
+
+**Configuration in `etc/catalog/gravitino.properties`:**
+
+```properties
+connector.name=gravitino
+gravitino.metalake=metalake
+gravitino.uri=http://localhost:8090
+
+# Basic authentication with built-in IDP
+gravitino.client.authType=basic
+gravitino.client.basic.username=admin
+gravitino.client.basic.password=YourSecureGravitinoPassword
+```
+
+**Configuration properties:**
+
+| Property                            | Description                            
                             | Default value   | Required                     | 
Since version   |
+|-------------------------------------|---------------------------------------------------------------------|-----------------|------------------------------|-----------------|
+| `gravitino.client.authType`         | Authentication type: `simple`, 
`basic`, `oauth2`, or `kerberos`     | (none)          | Yes (to enable Basic)  
      | 1.3.0           |
+| `gravitino.client.basic.username`   | Built-in IDP username                  
                             | (none)          | Yes if authType is `basic`   | 
1.3.0           |
+| `gravitino.client.basic.password`   | Built-in IDP password                  
                             | (none)          | Yes if authType is `basic`   | 
1.3.0           |
 
 ### OAuth2 Authentication
 
@@ -55,13 +82,13 @@ gravitino.client.oauth2.scope=gravitino
 
 **Configuration properties:**
 
-| Property                             | Description                           
                 | Default value | Required                    | Since version |
-|--------------------------------------|--------------------------------------------------------|---------------|-----------------------------|---------------|
-| `gravitino.client.authType`          | Authentication type: `simple`, 
`oauth2`, or `kerberos` | (none)        | Yes (to enable OAuth2)           | 
1.3.0         |
-| `gravitino.client.oauth2.serverUri`  | OAuth2 server URI                     
                 | (none)        | Yes if authType is `oauth2` | 1.3.0         |
-| `gravitino.client.oauth2.credential` | OAuth2 credentials in format 
`client_id:client_secret` | (none)        | Yes if authType is `oauth2` | 1.3.0 
        |
-| `gravitino.client.oauth2.path`       | OAuth2 token endpoint path            
                 | (none)        | Yes if authType is `oauth2` | 1.3.0         |
-| `gravitino.client.oauth2.scope`      | OAuth2 scope                          
                 | (none)        | Yes if authType is `oauth2` | 1.3.0         |
+| Property                               | Description                         
                                | Default value   | Required                    
 | Since version   |
+|----------------------------------------|---------------------------------------------------------------------|-----------------|------------------------------|-----------------|
+| `gravitino.client.authType`            | Authentication type: `simple`, 
`basic`, `oauth2`, or `kerberos`     | (none)          | Yes (to enable OAuth2) 
      | 1.3.0           |
+| `gravitino.client.oauth2.serverUri`    | OAuth2 server URI                   
                                | (none)          | Yes if authType is `oauth2` 
 | 1.3.0           |
+| `gravitino.client.oauth2.credential`   | OAuth2 credentials in format 
`client_id:client_secret`              | (none)          | Yes if authType is 
`oauth2`  | 1.3.0           |
+| `gravitino.client.oauth2.path`         | OAuth2 token endpoint path          
                                | (none)          | Yes if authType is `oauth2` 
 | 1.3.0           |
+| `gravitino.client.oauth2.scope`        | OAuth2 scope                        
                                | (none)          | Yes if authType is `oauth2` 
 | 1.3.0           |
 
 ### Kerberos Authentication
 
@@ -82,11 +109,11 @@ 
gravitino.client.kerberos.keytabFilePath=/path/to/user.keytab
 
 **Configuration properties:**
 
-| Property                                   | Description         | Default 
value | Required                                                   | Since 
version |
-|--------------------------------------------|---------------------|---------------|------------------------------------------------------------|---------------|
-| `gravitino.client.authType`                | Authentication type: `simple`, 
`oauth2`, or `kerberos` | (none)        | Yes (to enable Kerberos)              
                     | 1.3.0         |
-| `gravitino.client.kerberos.principal`      | Kerberos principal  | (none)    
    | Yes if authType is `kerberos`           | 1.3.0         |
-| `gravitino.client.kerberos.keytabFilePath` | Path to keytab file | (none)    
    | No (uses ticket cache if not specified) | 1.3.0         |
+| Property                                     | Description                   
                                      | Default value   | Required              
                    | Since version   |
+|----------------------------------------------|---------------------------------------------------------------------|-----------------|-------------------------------------------|-----------------|
+| `gravitino.client.authType`                  | Authentication type: 
`simple`, `basic`, `oauth2`, or `kerberos`     | (none)          | Yes (to 
enable Kerberos)                  | 1.3.0           |
+| `gravitino.client.kerberos.principal`        | Kerberos principal            
                                      | (none)          | Yes if authType is 
`kerberos`             | 1.3.0           |
+| `gravitino.client.kerberos.keytabFilePath`   | Path to keytab file           
                                      | (none)          | No (uses ticket cache 
if not specified)   | 1.3.0           |
 
 
 ### Example: Connecting to OAuth-Protected Gravitino Server
@@ -141,11 +168,11 @@ gravitino.client.session.forwardUser=true
 
 **Configuration properties:**
 
-| Property                                                   | Description     
                                                                           | 
Default value | Required | Since version |
-|------------------------------------------------------------|--------------------------------------------------------------------------------------------|---------------|----------|---------------|
-| `gravitino.client.session.forwardUser`                     | When `true` 
with `authType=simple`, forwards the Trino session user to Gravitino per-query 
| `false`       | No       | 1.3.0         |
-| `gravitino.client.session.cache.maxSize`                   | Maximum number 
of per-user sessions to keep in the cache                                   | 
`500`         | No       | 1.3.0         |
-| `gravitino.client.session.cache.expireAfterAccessSeconds`  | Seconds before 
an idle per-user session is evicted from the cache                          | 
`3600`        | No       | 1.3.0         |
+| Property                                                     | Description   
                                                                               
| Default value   | Required   | Since version   |
+|--------------------------------------------------------------|----------------------------------------------------------------------------------------------|-----------------|------------|-----------------|
+| `gravitino.client.session.forwardUser`                       | When `true` 
with `authType=simple`, forwards the Trino session user to Gravitino per-query  
 | `false`         | No         | 1.3.0           |
+| `gravitino.client.session.cache.maxSize`                     | Maximum 
number of per-user sessions to keep in the cache                                
     | `500`           | No         | 1.3.0           |
+| `gravitino.client.session.cache.expireAfterAccessSeconds`    | Seconds 
before an idle per-user session is evicted from the cache                       
     | `3600`          | No         | 1.3.0           |
 
 ### Notes
 
@@ -157,4 +184,5 @@ gravitino.client.session.forwardUser=true
 ### See Also
 
 - [Gravitino Server Authentication 
Configuration](../security/how-to-authenticate.md)
+- [How to use the built-in IDP](../security/how-to-use-built-in-idp.md)
 - [Trino Connector Configuration](./configuration.md)
diff --git a/docs/trino-connector/configuration.md 
b/docs/trino-connector/configuration.md
index f20b8a5fb6..63ec3065b4 100644
--- a/docs/trino-connector/configuration.md
+++ b/docs/trino-connector/configuration.md
@@ -28,4 +28,4 @@ Multi-metalake mode (`gravitino.use-single-metalake=false`) 
is supported on Trin
 
 ## Authentication
 
-The Gravitino Trino connector supports authenticating to the Gravitino server 
using Simple, OAuth, and Kerberos authentication. For detailed authentication 
configuration, refer to [Trino Connector Authentication](./authentication.md).
+The Gravitino Trino connector supports authenticating to the Gravitino server 
using Simple, Basic, OAuth, and Kerberos authentication. For detailed 
authentication configuration, refer to [Trino Connector 
Authentication](./authentication.md).
diff --git 
a/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/catalog/GravitinoCatalogManager.java
 
b/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/catalog/GravitinoCatalogManager.java
index 7eeb4fab71..6dd927e961 100644
--- 
a/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/catalog/GravitinoCatalogManager.java
+++ 
b/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/catalog/GravitinoCatalogManager.java
@@ -25,6 +25,7 @@ import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.Catalog;
 import org.apache.gravitino.client.DefaultOAuth2TokenProvider;
 import org.apache.gravitino.client.GravitinoAdminClient;
@@ -66,11 +67,14 @@ public class GravitinoCatalogManager {
     // simple auth otherwise).
     if (GravitinoCatalogStoreFactoryOptions.OAUTH2.equalsIgnoreCase(authType)) 
{
       this.gravitinoClient = buildOAuthClient(gravitinoUri, 
gravitinoClientConfig);
+    } else if 
(GravitinoCatalogStoreFactoryOptions.BASIC.equalsIgnoreCase(authType)) {
+      this.gravitinoClient = buildBasicClient(gravitinoUri, 
gravitinoClientConfig);
     } else {
       if (authType != null) {
         throw new IllegalArgumentException(
             String.format(
-                "Unsupported auth type '%s'. Only OAUTH is supported; leave %s 
unset to use Flink Kerberos settings (or simple auth if security is disabled).",
+                "Unsupported auth type '%s'. Only OAUTH and BASIC are 
supported; leave %s unset to"
+                    + " use Flink Kerberos settings (or simple auth if 
security is disabled).",
                 authType, GravitinoCatalogStoreFactoryOptions.AUTH_TYPE));
       }
 
@@ -244,6 +248,33 @@ public class GravitinoCatalogManager {
         && 
gravitinoCatalogManager.gravitinoClientConfig.equals(gravitinoClientConfig);
   }
 
+  private static GravitinoAdminClient buildBasicClient(
+      String gravitinoUri, Map<String, String> config) {
+    String username = 
config.get(GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME);
+    String password = 
config.get(GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD);
+    Preconditions.checkArgument(
+        StringUtils.isNotBlank(username),
+        "Basic username is required. Please set %s",
+        GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME);
+    Preconditions.checkArgument(
+        StringUtils.isNotBlank(password),
+        "Basic password is required. Please set %s",
+        GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD);
+
+    Set<String> basicConfigKeys =
+        Sets.newHashSet(
+            GravitinoCatalogStoreFactoryOptions.AUTH_TYPE,
+            GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME,
+            GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD);
+    for (String key : basicConfigKeys) {
+      config.remove(key);
+    }
+    return GravitinoAdminClient.builder(gravitinoUri)
+        .withBasicAuth(username, password)
+        .withClientConfig(config)
+        .build();
+  }
+
   private static GravitinoAdminClient buildOAuthClient(
       String gravitinoUri, Map<String, String> config) {
     String serverUri = 
config.get(GravitinoCatalogStoreFactoryOptions.OAUTH2_SERVER_URI);
diff --git 
a/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/store/GravitinoCatalogStoreFactoryOptions.java
 
b/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/store/GravitinoCatalogStoreFactoryOptions.java
index f2ac8b52ff..6c2d0085fb 100644
--- 
a/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/store/GravitinoCatalogStoreFactoryOptions.java
+++ 
b/flink-connector/flink-common/src/main/java/org/apache/gravitino/flink/connector/store/GravitinoCatalogStoreFactoryOptions.java
@@ -55,6 +55,11 @@ public class GravitinoCatalogStoreFactoryOptions {
 
   public static final String AUTH_TYPE = "gravitino.client.auth.type";
   public static final String OAUTH2 = "oauth2";
+  public static final String BASIC = "basic";
+
+  // Basic auth config keys
+  public static final String BASIC_USERNAME = 
"gravitino.client.basic.username";
+  public static final String BASIC_PASSWORD = 
"gravitino.client.basic.password";
 
   // OAuth2 config keys
   public static final String OAUTH2_SERVER_URI = 
"gravitino.client.oauth2.serverUri";
diff --git 
a/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/catalog/TestGravitinoCatalogManagerBasicAuth.java
 
b/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/catalog/TestGravitinoCatalogManagerBasicAuth.java
new file mode 100644
index 0000000000..bd2b30f8c4
--- /dev/null
+++ 
b/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/catalog/TestGravitinoCatalogManagerBasicAuth.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.catalog;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.gravitino.client.GravitinoAdminClient;
+import 
org.apache.gravitino.flink.connector.store.GravitinoCatalogStoreFactoryOptions;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+
+/** Unit tests for Flink catalog store Basic authentication client 
configuration. */
+public class TestGravitinoCatalogManagerBasicAuth {
+
+  private static final String GRAVITINO_URI = "http://127.0.0.1:8090";;
+  private static final String METALAKE = "flink_basic_auth";
+
+  @AfterEach
+  void tearDown() {
+    try {
+      GravitinoCatalogManager.get().close();
+    } catch (IllegalStateException ignore) {
+      // GravitinoCatalogManager was not created in this test.
+    }
+  }
+
+  @Test
+  void testCreateWithBasicAuth() {
+    Map<String, String> config = basicAuthConfig("alice", "secret");
+    GravitinoAdminClient client =
+        GravitinoAdminClient.builder(GRAVITINO_URI)
+            .withBasicAuth(
+                config.get(GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME),
+                config.get(GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD))
+            .build();
+    assertNotNull(client);
+  }
+
+  @Test
+  void testCreateWithBasicAuthMissingUsername() {
+    Map<String, String> config = basicAuthConfig("alice", "secret");
+    config.remove(GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME);
+    assertThrows(
+        IllegalArgumentException.class,
+        () -> GravitinoCatalogManager.create(GRAVITINO_URI, METALAKE, config));
+  }
+
+  @Test
+  void testCreateWithBasicAuthMissingPassword() {
+    Map<String, String> config = basicAuthConfig("alice", "secret");
+    config.remove(GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD);
+    assertThrows(
+        IllegalArgumentException.class,
+        () -> GravitinoCatalogManager.create(GRAVITINO_URI, METALAKE, config));
+  }
+
+  @Test
+  void testCreateWithBasicAuthBlankCredentials() {
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoCatalogManager.create(
+                GRAVITINO_URI, METALAKE, basicAuthConfig(" ", "secret")));
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoCatalogManager.create(GRAVITINO_URI, METALAKE, 
basicAuthConfig("alice", " ")));
+  }
+
+  private static Map<String, String> basicAuthConfig(String username, String 
password) {
+    return new HashMap<>(
+        ImmutableMap.of(
+            GravitinoCatalogStoreFactoryOptions.AUTH_TYPE,
+            GravitinoCatalogStoreFactoryOptions.BASIC,
+            GravitinoCatalogStoreFactoryOptions.BASIC_USERNAME,
+            username,
+            GravitinoCatalogStoreFactoryOptions.BASIC_PASSWORD,
+            password));
+  }
+}
diff --git 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/GravitinoSparkConfig.java
 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/GravitinoSparkConfig.java
index 30e5b990d3..be108c9af1 100644
--- 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/GravitinoSparkConfig.java
+++ 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/GravitinoSparkConfig.java
@@ -42,6 +42,10 @@ public class GravitinoSparkConfig {
       GRAVITINO_PREFIX + AuthProperties.GRAVITINO_OAUTH2_CREDENTIAL;
   public static final String GRAVITINO_OAUTH2_SCOPE =
       GRAVITINO_PREFIX + AuthProperties.GRAVITINO_OAUTH2_SCOPE;
+  public static final String GRAVITINO_BASIC_USERNAME =
+      GRAVITINO_PREFIX + AuthProperties.GRAVITINO_BASIC_USERNAME;
+  public static final String GRAVITINO_BASIC_PASSWORD =
+      GRAVITINO_PREFIX + AuthProperties.GRAVITINO_BASIC_PASSWORD;
   public static final String GRAVITINO_KERBEROS_PRINCIPAL = 
"spark.kerberos.principal";
   public static final String GRAVITINO_KERBEROS_KEYTAB_FILE_PATH = 
"spark.kerberos.keytab";
 
diff --git 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/plugin/GravitinoDriverPlugin.java
 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/plugin/GravitinoDriverPlugin.java
index 7f0f31ab6c..ea0e03aa9d 100644
--- 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/plugin/GravitinoDriverPlugin.java
+++ 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/plugin/GravitinoDriverPlugin.java
@@ -191,7 +191,17 @@ public class GravitinoDriverPlugin implements DriverPlugin 
{
     }
   }
 
-  private static GravitinoClient createGravitinoClient(
+  /**
+   * Creates a Gravitino client using authentication settings from the Spark 
configuration.
+   *
+   * @param uri Gravitino REST server URI
+   * @param metalake Gravitino metalake name
+   * @param sparkConf Spark configuration containing auth settings
+   * @param sparkUser Spark session user for simple authentication
+   * @param clientConfig additional Gravitino client configuration
+   * @return configured Gravitino client
+   */
+  public static GravitinoClient createGravitinoClient(
       String uri,
       String metalake,
       SparkConf sparkConf,
@@ -206,6 +216,10 @@ public class GravitinoDriverPlugin implements DriverPlugin 
{
           !UserGroupInformation.isSecurityEnabled(),
           "Spark simple auth mode doesn't support setting kerberos 
configurations");
       builder.withSimpleAuth(sparkUser);
+    } else if (AuthProperties.isBasic(authType)) {
+      String username = getRequiredConfig(sparkConf, 
GravitinoSparkConfig.GRAVITINO_BASIC_USERNAME);
+      String password = getRequiredConfig(sparkConf, 
GravitinoSparkConfig.GRAVITINO_BASIC_PASSWORD);
+      builder.withBasicAuth(username, password);
     } else if (AuthProperties.isOAuth2(authType)) {
       String oAuthUri = getRequiredConfig(sparkConf, 
GravitinoSparkConfig.GRAVITINO_OAUTH2_URI);
       String credential =
diff --git 
a/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/plugin/TestGravitinoSparkBasicAuth.java
 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/plugin/TestGravitinoSparkBasicAuth.java
new file mode 100644
index 0000000000..8e6491ab9b
--- /dev/null
+++ 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/plugin/TestGravitinoSparkBasicAuth.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.spark.connector.plugin;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.Collections;
+import org.apache.gravitino.auth.AuthProperties;
+import org.apache.gravitino.client.GravitinoAdminClient;
+import org.apache.gravitino.spark.connector.GravitinoSparkConfig;
+import org.apache.spark.SparkConf;
+import org.junit.jupiter.api.Test;
+
+/** Unit tests for Spark connector Basic authentication client configuration. 
*/
+public class TestGravitinoSparkBasicAuth {
+
+  private static final String GRAVITINO_URI = "http://127.0.0.1:8090";;
+  private static final String METALAKE = "spark_basic_auth";
+  private static final String SPARK_USER = "spark-user";
+
+  @Test
+  void testCreateClientWithBasicAuth() {
+    SparkConf sparkConf = basicAuthSparkConf("alice", "secret");
+    GravitinoAdminClient client =
+        GravitinoAdminClient.builder(GRAVITINO_URI)
+            .withBasicAuth(
+                sparkConf.get(GravitinoSparkConfig.GRAVITINO_BASIC_USERNAME),
+                sparkConf.get(GravitinoSparkConfig.GRAVITINO_BASIC_PASSWORD))
+            .build();
+    assertNotNull(client);
+  }
+
+  @Test
+  void testCreateClientWithBasicAuthMissingUsername() {
+    SparkConf sparkConf =
+        new SparkConf()
+            .set(GravitinoSparkConfig.GRAVITINO_AUTH_TYPE, 
AuthProperties.BASIC_AUTH_TYPE)
+            .set(GravitinoSparkConfig.GRAVITINO_BASIC_PASSWORD, "secret");
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoDriverPlugin.createGravitinoClient(
+                GRAVITINO_URI, METALAKE, sparkConf, SPARK_USER, 
Collections.emptyMap()));
+  }
+
+  @Test
+  void testCreateClientWithBasicAuthMissingPassword() {
+    SparkConf sparkConf =
+        new SparkConf()
+            .set(GravitinoSparkConfig.GRAVITINO_AUTH_TYPE, 
AuthProperties.BASIC_AUTH_TYPE)
+            .set(GravitinoSparkConfig.GRAVITINO_BASIC_USERNAME, "alice");
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoDriverPlugin.createGravitinoClient(
+                GRAVITINO_URI, METALAKE, sparkConf, SPARK_USER, 
Collections.emptyMap()));
+  }
+
+  @Test
+  void testCreateClientWithBasicAuthBlankCredentials() {
+    SparkConf blankUsernameConf = basicAuthSparkConf(" ", "secret");
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoDriverPlugin.createGravitinoClient(
+                GRAVITINO_URI, METALAKE, blankUsernameConf, SPARK_USER, 
Collections.emptyMap()));
+
+    SparkConf blankPasswordConf = basicAuthSparkConf("alice", " ");
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoDriverPlugin.createGravitinoClient(
+                GRAVITINO_URI, METALAKE, blankPasswordConf, SPARK_USER, 
Collections.emptyMap()));
+  }
+
+  private static SparkConf basicAuthSparkConf(String username, String 
password) {
+    return new SparkConf()
+        .set(GravitinoSparkConfig.GRAVITINO_AUTH_TYPE, 
AuthProperties.BASIC_AUTH_TYPE)
+        .set(GravitinoSparkConfig.GRAVITINO_BASIC_USERNAME, username)
+        .set(GravitinoSparkConfig.GRAVITINO_BASIC_PASSWORD, password);
+  }
+}
diff --git 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/security/GravitinoAuthProvider.java
 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/security/GravitinoAuthProvider.java
index 247639c6cd..21e2e25604 100644
--- 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/security/GravitinoAuthProvider.java
+++ 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/security/GravitinoAuthProvider.java
@@ -18,6 +18,7 @@
  */
 package org.apache.gravitino.trino.connector.security;
 
+import com.google.common.base.Preconditions;
 import io.trino.spi.connector.ConnectorSession;
 import java.io.File;
 import java.util.Locale;
@@ -54,6 +55,14 @@ public class GravitinoAuthProvider {
   public static final String FORWARD_SESSION_USER_KEY =
       GravitinoClientConfiguration.GRAVITINO_CLIENT_CONFIG_PREFIX + 
"session.forwardUser";
 
+  /** Built-in IdP username configuration key for Basic authentication. */
+  public static final String BASIC_USERNAME_KEY =
+      GravitinoClientConfiguration.GRAVITINO_CLIENT_CONFIG_PREFIX + 
"basic.username";
+
+  /** Built-in IdP password configuration key for Basic authentication. */
+  public static final String BASIC_PASSWORD_KEY =
+      GravitinoClientConfiguration.GRAVITINO_CLIENT_CONFIG_PREFIX + 
"basic.password";
+
   /** OAuth2 server URI configuration key. */
   public static final String OAUTH_SERVER_URI_KEY =
       GravitinoClientConfiguration.GRAVITINO_CLIENT_CONFIG_PREFIX + 
"oauth2.serverUri";
@@ -90,6 +99,7 @@ public class GravitinoAuthProvider {
   /** Authentication types supported by the Trino connector. */
   public enum AuthType {
     SIMPLE,
+    BASIC,
     OAUTH2,
     KERBEROS,
     NONE
@@ -118,6 +128,9 @@ public class GravitinoAuthProvider {
         case SIMPLE:
           buildSimpleAuth(builder, config.getUser());
           break;
+        case BASIC:
+          buildBasicAuth(builder, clientConfig);
+          break;
         case OAUTH2:
           builder.withOAuth(buildOAuthProvider(clientConfig));
           break;
@@ -202,7 +215,8 @@ public class GravitinoAuthProvider {
     } catch (IllegalArgumentException e) {
       throw new IllegalArgumentException(
           String.format(
-              "Invalid authentication type: %s. Valid values are: simple, 
oauth2, kerberos, none",
+              "Invalid authentication type: %s. Valid values are: simple, 
basic, oauth2, kerberos,"
+                  + " none",
               authTypeStr),
           e);
     }
@@ -210,6 +224,8 @@ public class GravitinoAuthProvider {
 
   private static void removeAuthSpecificKeys(Map<String, String> clientConfig) 
{
     clientConfig.remove(AUTH_TYPE_KEY);
+    clientConfig.remove(BASIC_USERNAME_KEY);
+    clientConfig.remove(BASIC_PASSWORD_KEY);
     clientConfig.remove(OAUTH_SERVER_URI_KEY);
     clientConfig.remove(OAUTH_CREDENTIAL_KEY);
     clientConfig.remove(OAUTH_PATH_KEY);
@@ -230,6 +246,21 @@ public class GravitinoAuthProvider {
     }
   }
 
+  private static void buildBasicAuth(
+      GravitinoAdminClient.AdminClientBuilder builder, Map<String, String> 
config) {
+    String username = config.get(BASIC_USERNAME_KEY);
+    String password = config.get(BASIC_PASSWORD_KEY);
+    Preconditions.checkArgument(
+        StringUtils.isNotBlank(username),
+        "Basic username is required. Please set %s",
+        BASIC_USERNAME_KEY);
+    Preconditions.checkArgument(
+        StringUtils.isNotBlank(password),
+        "Basic password is required. Please set %s",
+        BASIC_PASSWORD_KEY);
+    builder.withBasicAuth(username, password);
+  }
+
   private static DefaultOAuth2TokenProvider buildOAuthProvider(Map<String, 
String> config) {
     String serverUri = config.get(OAUTH_SERVER_URI_KEY);
     String credential = config.get(OAUTH_CREDENTIAL_KEY);
diff --git 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/security/TestGravitinoAuthProvider.java
 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/security/TestGravitinoAuthProvider.java
index 53e5e3df5f..131eee6af2 100644
--- 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/security/TestGravitinoAuthProvider.java
+++ 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/security/TestGravitinoAuthProvider.java
@@ -69,6 +69,64 @@ public class TestGravitinoAuthProvider {
                 
buildConfig(ImmutableMap.of(GravitinoAuthProvider.AUTH_TYPE_KEY, "simple"))));
   }
 
+  @Test
+  public void testBuildBasicAuth() {
+    GravitinoAdminClient client =
+        GravitinoAuthProvider.build(
+            buildConfig(
+                ImmutableMap.of(
+                    GravitinoAuthProvider.AUTH_TYPE_KEY, "basic",
+                    GravitinoAuthProvider.BASIC_USERNAME_KEY, "alice",
+                    GravitinoAuthProvider.BASIC_PASSWORD_KEY, "secret")));
+    assertNotNull(client);
+  }
+
+  @Test
+  public void testBuildBasicAuthMissingUsername() {
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoAuthProvider.build(
+                buildConfig(
+                    ImmutableMap.of(
+                        GravitinoAuthProvider.AUTH_TYPE_KEY, "basic",
+                        GravitinoAuthProvider.BASIC_PASSWORD_KEY, "secret"))));
+  }
+
+  @Test
+  public void testBuildBasicAuthMissingPassword() {
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoAuthProvider.build(
+                buildConfig(
+                    ImmutableMap.of(
+                        GravitinoAuthProvider.AUTH_TYPE_KEY, "basic",
+                        GravitinoAuthProvider.BASIC_USERNAME_KEY, "alice"))));
+  }
+
+  @Test
+  public void testBuildBasicAuthBlankCredentials() {
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoAuthProvider.build(
+                buildConfig(
+                    ImmutableMap.of(
+                        GravitinoAuthProvider.AUTH_TYPE_KEY, "basic",
+                        GravitinoAuthProvider.BASIC_USERNAME_KEY, " ",
+                        GravitinoAuthProvider.BASIC_PASSWORD_KEY, "secret"))));
+    assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            GravitinoAuthProvider.build(
+                buildConfig(
+                    ImmutableMap.of(
+                        GravitinoAuthProvider.AUTH_TYPE_KEY, "basic",
+                        GravitinoAuthProvider.BASIC_USERNAME_KEY, "alice",
+                        GravitinoAuthProvider.BASIC_PASSWORD_KEY, " "))));
+  }
+
   @Test
   public void testBuildClientInvalidAuthType() {
     assertThrows(

Reply via email to