Skip to main content
Version: Next

How to use built-in IDP

Introduction​

Apache Gravitino can store built-in IDP (identity provider) users and groups in the relational metadata store through the idp-basic plugin. This gives you a self-contained way to manage global login identities (usernames, password hashes, and group membership) without an external server.

Built-in IDP is aimed at POC, offline, and isolated deployments. It is not a replacement for enterprise IDPs such as Okta, Azure AD, or Keycloak. Use it only where a lightweight local identity store is acceptable; restrict management APIs to service admins, store password hashes only, and prefer HTTPS when credentials travel over the network.

This guide describes how to enable and operate the management APIs in plugins:idp-basic. For request and response schemas, see the Built-in IDP OpenAPI.

Web UI​

When built-in IdP Basic authentication is enabled, the Web UI exposes a username and password login form. Configure both of the following in gravitino.conf:

gravitino.authenticators = basic
gravitino.server.rest.extensionPackages = org.apache.gravitino.idp.web.rest.feature

The Web UI reads gravitino.authenticators from /configs and uses the first entry as the active authentication type. List basic first when you want the built-in IdP login form. Built-in IdP is incompatible with the simple authenticator (the default). When IdP is enabled, do not include simple in gravitino.authenticators.


Prerequisites​

Before you call /api/idp/*, ensure the following:

  1. IDP REST API registration — In gravitino.conf, set:

    gravitino.authenticators = basic
    gravitino.server.rest.extensionPackages = org.apache.gravitino.idp.web.rest.feature
  2. Server authenticator — Built-in IdP is incompatible with the simple authenticator (the default). Do not list simple together with basic in gravitino.authenticators.

  3. Service admin passwords — Built-in IDP requires every username in gravitino.authorization.serviceAdmins to have a password stored in idp_user_meta before you can call management APIs.

    1. Set service admin usernames in gravitino.conf (see Access control):

      gravitino.authorization.serviceAdmins = admin
    2. Initialize service admin passwords at startup — Before the first start, set GRAVITINO_INITIAL_ADMIN_PASSWORD to the initial password. Usernames come from gravitino.authorization.serviceAdmins. The value must satisfy the password rules below.

      export GRAVITINO_INITIAL_ADMIN_PASSWORD='Passw0rd-Admin12'
    3. Start Gravitino.

    4. Call management APIs — Use Basic authentication with a service admin username and password (for example admin / Passw0rd-Admin12).


Configuration​

Set service admins in gravitino.conf (see also Prerequisites):

Configuration itemDescriptionExample
gravitino.authenticatorsMust include basic when the built-in IdP plugin is enabledbasic
gravitino.server.rest.extensionPackagesRegisters built-in IdP REST APIsorg.apache.gravitino.idp.web.rest.feature
gravitino.authorization.serviceAdminsComma-separated service admin that can call built-in IDP management APIsadmin

Example:

gravitino.authenticators = basic
gravitino.server.rest.extensionPackages = org.apache.gravitino.idp.web.rest.feature
gravitino.authorization.serviceAdmins = admin

Operations​

The following sections show how to call built-in IDP management APIs with curl. Replace localhost:8090, usernames, and passwords with values that match your deployment. Examples use Basic authentication with admin / Passw0rd-Admin12 (from Prerequisites).

Base URL — http://<host>:<port>/api/idp

Common headers

HeaderValue
Acceptapplication/vnd.gravitino.v1+json
Content-Typeapplication/json (for POST and PUT bodies)

Example:

curl -s -H "Accept: application/vnd.gravitino.v1+json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
http://localhost:8090/api/idp/users/alice

Password and username rules​

Password rules apply to add-user, change-password, and GRAVITINO_INITIAL_ADMIN_PASSWORD:

RuleValue
UsernameRequired; must not contain :
Password length12–64 characters (inclusive)

Password reset is admin-only (request body has password only; no oldPassword).

User operations​

Get a user​

GET /api/idp/users/{user}

curl -s -H "Accept: application/vnd.gravitino.v1+json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
http://localhost:8090/api/idp/users/alice

Add a user​

POST /api/idp/users

The request body uses field user (not name):

curl -s -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"user":"alice","password":"Passw0rd-Alice"}' \
http://localhost:8090/api/idp/users

Change a user password​

PUT /api/idp/users/{user}

Administrator reset only:

curl -s -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"password":"Passw0rd-Alice-V2"}' \
http://localhost:8090/api/idp/users/alice

Remove a user​

DELETE /api/idp/users/{user}

curl -s -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
http://localhost:8090/api/idp/users/alice

Group operations​

Get a group​

GET /api/idp/groups/{group}

curl -s -H "Accept: application/vnd.gravitino.v1+json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
http://localhost:8090/api/idp/groups/engineering

Add a group​

POST /api/idp/groups

The request body uses field group (not name):

curl -s -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"group":"engineering"}' \
http://localhost:8090/api/idp/groups

Remove a group​

DELETE /api/idp/groups/{group}?force={true|false}

If the group still has members, deletion fails unless force=true.

curl -s -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
'http://localhost:8090/api/idp/groups/engineering?force=true'

Change group membership​

PUT /api/idp/groups/{group}/users

Add and/or remove members in one request. At least one of usersToAdd or usersToRemove is required.

curl -s -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"usersToAdd":["alice","bob"],"usersToRemove":["carol"]}' \
http://localhost:8090/api/idp/groups/engineering/users

For full request and response definitions, see the Built-in IDP OpenAPI.


Engines using Basic authentication​

Configure Basic credentials on each engine connector. See Spark authentication, Flink authentication, and Trino authentication for full connector setup.

Spark​

spark.sql.gravitino.authType=basic
spark.sql.gravitino.basic.username=${username}
spark.sql.gravitino.basic.password=${password}
table.catalog-store.gravitino.gravitino.client.auth.type: basic
table.catalog-store.gravitino.gravitino.client.basic.username: ${username}
table.catalog-store.gravitino.gravitino.client.basic.password: ${password}

Trino​

In etc/catalog/gravitino.properties:

gravitino.client.authType=basic
gravitino.client.basic.username=${username}
gravitino.client.basic.password=${password}

Engines using Basic authentication for Iceberg REST catalog​

Connect Spark, Flink, and Trino directly to the Gravitino Iceberg REST (IRC) endpoint at http://<gravitino-host>:9001/iceberg/. No Gravitino engine connector plugin is required. Configure only the Basic auth properties below. See Connect Spark via Iceberg REST, Connect Flink via Iceberg REST, and Connect Trino via Iceberg REST for full IRC setup.

Spark​

spark.sql.catalog.<catalog-name>.rest.auth.type=basic
spark.sql.catalog.<catalog-name>.rest.auth.basic.username=${username}
spark.sql.catalog.<catalog-name>.rest.auth.basic.password=${password}
'rest.auth.type' = 'basic',
'rest.auth.basic.username' = '${username}',
'rest.auth.basic.password' = '${password}'

Trino​

Requires Trino 481+. Trino has no native Basic mode for Iceberg REST; pass Authorization via HTTP headers.

Generate Base64 once:

echo -n '${username}:${password}' | base64

In etc/catalog/<catalog-name>.properties:

iceberg.rest-catalog.http-headers=Authorization: Basic <base64-credentials>

Replace <base64-credentials> with the output of echo -n '${username}:${password}' | base64.


End-to-end setup​

The following steps provision Gravitino and engines so a named user can connect with Basic credentials. The examples use service admin admin / Passw0rd-Admin12, engine user alice / Passw0rd-Alice12, metalake example, and Gravitino at http://localhost:8090. Replace these with values that match your deployment.

1. Admin initialization​

  1. Append the following to gravitino.conf (see also Prerequisites and Configuration):

    gravitino.authenticators = basic
    gravitino.server.rest.extensionPackages = org.apache.gravitino.idp.web.rest.feature
    gravitino.authorization.enable = true
    gravitino.authorization.serviceAdmins = admin

    Built-in IdP is incompatible with the simple authenticator (the default), gravitino.authenticators must include basic and must not include simple.

  2. Before the first start, set the initial service admin password (see password rules):

    export GRAVITINO_INITIAL_ADMIN_PASSWORD='Passw0rd-Admin12'
  3. Start Gravitino and verify the service admin can call the API:

    curl -s -H "Accept: application/vnd.gravitino.v1+json" \
    -H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
    http://localhost:8090/api/version

2. Create users​

Create a built-in IdP user for each engine or operator account. Service admins call /api/idp/users (see Add a user):

curl -s -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"user":"alice","password":"Passw0rd-Alice12"}' \
http://localhost:8090/api/idp/users

3. Create a metalake​

Create a metalake with a service admin account. When authorization is enabled, only service admins can create metalakes (see Access control). See also Manage metalakes.

curl -s -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"name":"example","comment":"Basic auth example","properties":{}}' \
http://localhost:8090/api/metalakes

Create catalogs in this metalake before engines can query data. See Manage relational metadata.

4. Add users to the metalake​

Register the engine user in the metalake authorization namespace (see Add a user). The username must match a built-in IdP user created in step 2:

curl -s -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Passw0rd-Admin12' | base64)" \
-d '{"name":"alice"}' \
http://localhost:8090/api/metalakes/example/users

Grant roles or ownership as needed so the user can access catalogs and metadata. See Access control.

5. Configure engines to use Basic authentication​

Configure each engine with http://localhost:8090, metalake example, and user alice / Passw0rd-Alice12 from step 2. Deploy the Gravitino connector for each engine first; see Spark authentication, Flink authentication, and Trino authentication.

Spark​

$SPARK_HOME/bin/spark-sql \
--conf spark.plugins=org.apache.gravitino.spark.connector.plugin.GravitinoSparkPlugin \
--conf spark.sql.gravitino.uri=http://localhost:8090 \
--conf spark.sql.gravitino.metalake=example \
--conf spark.sql.gravitino.authType=basic \
--conf spark.sql.gravitino.basic.username=alice \
--conf spark.sql.gravitino.basic.password=Passw0rd-Alice12 \
-e "SHOW CATALOGS;"
$FLINK_HOME/bin/sql-client.sh \
-D table.catalog-store.kind=gravitino \
-D table.catalog-store.gravitino.gravitino.uri=http://localhost:8090 \
-D table.catalog-store.gravitino.gravitino.metalake=example \
-D table.catalog-store.gravitino.gravitino.client.auth.type=basic \
-D table.catalog-store.gravitino.gravitino.client.basic.username=alice \
-D table.catalog-store.gravitino.gravitino.client.basic.password=Passw0rd-Alice12

Trino​

Create etc/catalog/gravitino.properties:

connector.name=gravitino
gravitino.uri=http://localhost:8090
gravitino.metalake=example
gravitino.client.authType=basic
gravitino.client.basic.username=alice
gravitino.client.basic.password=Passw0rd-Alice12

Set catalog.management=dynamic in etc/config.properties, restart Trino, then verify:

$TRINO_HOME/bin/launcher restart
java -jar trino-cli.jar --server http://localhost:8080 --user alice \
--execute "SHOW CATALOGS"

6. Access Iceberg REST catalog with Basic authentication​

Connect engines directly to http://localhost:9001/iceberg. No Gravitino connector plugin is required. Use user alice / Passw0rd-Alice12 from step 2. See Connect Spark via Iceberg REST, Connect Flink via Iceberg REST, and Connect Trino via Iceberg REST for full IRC setup.

Spark​

$SPARK_HOME/bin/spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.gravitino_irc=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.gravitino_irc.type=rest \
--conf spark.sql.catalog.gravitino_irc.uri=http://localhost:9001/iceberg \
--conf spark.sql.catalog.gravitino_irc.rest.auth.type=basic \
--conf spark.sql.catalog.gravitino_irc.rest.auth.basic.username=alice \
--conf spark.sql.catalog.gravitino_irc.rest.auth.basic.password=Passw0rd-Alice12 \
-e "SHOW NAMESPACES IN gravitino_irc;"
cat > /tmp/flink-irc.sql <<'EOF'
CREATE CATALOG gravitino_irc WITH (
'type' = 'iceberg',
'catalog-type' = 'rest',
'uri' = 'http://localhost:9001/iceberg',
'rest.auth.type' = 'basic',
'rest.auth.basic.username' = 'alice',
'rest.auth.basic.password' = 'Passw0rd-Alice12'
);
USE CATALOG gravitino_irc;
SHOW DATABASES;
EOF

$FLINK_HOME/bin/sql-client.sh -f /tmp/flink-irc.sql

Trino​

Requires Trino 481+. Trino has no native Basic mode for Iceberg REST; pass Authorization via HTTP headers.

echo -n 'alice:Passw0rd-Alice12' | base64

Create etc/catalog/gravitino_irc.properties:

connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=http://localhost:9001/iceberg
iceberg.rest-catalog.http-headers=Authorization: Basic YWxpc2U6UGFzc3cwcmQtQWxpY2UxMg==

Restart Trino and verify:

$TRINO_HOME/bin/launcher restart
java -jar trino-cli.jar --server http://localhost:8080 --user alice \
--execute "SHOW SCHEMAS FROM gravitino_irc"

Further reading​