Accorder des autorisations par programmation
Les autorisations de projet Lakebase peuvent être gérées par programmation à l'aide de l'API Databricks Permissions standard, de la CLI Databricks, des SDK Databricks et de Terraform.
Pour un aperçu des types d'autorisations, des autorisations par default et de la façon de gérer les autorisations dans l'interface utilisateur de Lakebase, consultez Gérer les autorisations de projet.
Niveaux d'autorisation
Les niveaux d’autorisation accordables pour les projets Lakebase sont CAN_USE et CAN_MANAGE. CAN_CREATE est un niveau hérité qui transite automatiquement du workspace vers tous les utilisateurs et ne peut être explicitement accordé ou révoqué sur un projet. Les tentatives d'accorder CAN_CREATE via l'API renvoient le code HTTP 400.
L'API de Permissions identifie les projets par ID de projet (par exemple, my-app). Vous pouvez trouver cette valeur dans le champ project_id du statut du projet renvoyé par les APIs Get project et List projects.
Le champ project_id est disponible dans les réponses de l'API REST, mais pas encore dans les objets de réponse du SDK ou de la CLI. Si vous utilisez un SDK, vous pouvez extraire l'ID du projet du champ name en supprimant le préfixe projects/ (par exemple, projects/my-app devient my-app).
API REST
Les autorisations de projet utilisent l'API d'autorisations Databricks standard à /api/2.0/permissions/database-projects/{project_id}.
Obtenir les autorisations actuelles
curl -X GET "https://${DATABRICKS_HOST}/api/2.0/permissions/database-projects/${PROJECT_ID}" \
-H "Authorization: Bearer ${DATABRICKS_TOKEN}" | jq
Accorder ou mettre à jour les autorisations (PATCH)
curl -X PATCH "https://${DATABRICKS_HOST}/api/2.0/permissions/database-projects/${PROJECT_ID}" \
-H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"access_control_list": [
{
"user_name": "user@example.com",
"permission_level": "CAN_USE"
}
]
}'
Pour accorder des autorisations à un groupe ou à un Service Principal, remplacez user_name par group_name ou service_principal_name.
PATCH est additif et ne peut pas réduire une permission supérieure existante. Par exemple, l'application d'un correctif CAN_USE à un utilisateur qui détient déjà CAN_MANAGE n'a aucun effet. Pour rétrograder ou supprimer une autorisation, utilisez PUT à la place.
Remplacez toutes les autorisations explicites (PUT)
PUT remplace l’intégralité de l’ACL explicite. Tout utilisateur, groupe ou service principal non inclus dans le corps de la requête perd sa permission explicitement accordée. Les autorisations héritées (telles que celles des administrateurs du Workspace) ne sont pas affectées.
curl -X PUT "https://${DATABRICKS_HOST}/api/2.0/permissions/database-projects/${PROJECT_ID}" \
-H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"access_control_list": [
{
"user_name": "user@example.com",
"permission_level": "CAN_MANAGE"
}
]
}'
Pour la référence complète de l'API Permissions, consultez API Permissions.
CLI
Utilisez les commandes databricks permissions (qui encapsulent l'API des autorisations) pour gérer les autorisations de projet à partir de la ligne de commande.
Accorder ou mettre à jour les autorisations
# PROJECT_ID is your project ID (e.g., my-app).
databricks permissions update database-projects ${PROJECT_ID} \
--json '{
"access_control_list": [
{
"user_name": "user@example.com",
"permission_level": "CAN_USE"
}
]
}'
Obtenir les autorisations actuelles
databricks permissions get database-projects ${PROJECT_ID}
Utilisez databricks permissions (et non databricks postgres) pour la gestion des ACL du projet. La sous-commande databricks postgres gère les Ressources du projet (Branch, compute, etc.) et non les autorisations.
SDK
Utilisez l'interface WorkspaceClient.permissions dans le SDK Python, Java ou Go pour gérer les autorisations de projet.
- Python SDK
- Java SDK
- Go SDK
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.iam import AccessControlRequest, PermissionLevel
w = WorkspaceClient()
# Your project ID (e.g., "my-app")
PROJECT_ID = "<project-id>"
# Grant CAN_USE to a user (PATCH is additive and cannot downgrade)
w.permissions.update(
request_object_type="database-projects",
request_object_id=PROJECT_ID,
access_control_list=[
AccessControlRequest(
user_name="user@example.com",
permission_level=PermissionLevel.CAN_USE,
)
],
)
# Get current permissions
permissions = w.permissions.get(
request_object_type="database-projects",
request_object_id=PROJECT_ID,
)
print(permissions)
# Revoke or downgrade: use set() (PUT), not update() (PATCH)
# update() with an empty list is a no-op; set() replaces the full explicit ACL
w.permissions.set(
request_object_type="database-projects",
request_object_id=PROJECT_ID,
access_control_list=[
# Include every identity that should retain explicit access
AccessControlRequest(
user_name="owner@example.com",
permission_level=PermissionLevel.CAN_MANAGE,
)
],
)
import com.databricks.sdk.WorkspaceClient;
import com.databricks.sdk.service.iam.*;
WorkspaceClient w = new WorkspaceClient();
// Your project ID (e.g., "my-app")
String projectId = "<project-id>";
// Grant CAN_USE to a user (PATCH is additive and cannot downgrade)
w.permissions().update(new UpdateObjectPermissions()
.setRequestObjectType("database-projects")
.setRequestObjectId(projectId)
.setAccessControlList(List.of(
new AccessControlRequest()
.setUserName("user@example.com")
.setPermissionLevel(PermissionLevel.CAN_USE)
))
);
// Get current permissions
ObjectPermissions permissions = w.permissions().get(
new GetPermissionRequest()
.setRequestObjectType("database-projects")
.setRequestObjectId(projectId)
);
import (
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/iam"
)
w, _ := databricks.NewWorkspaceClient()
// Your project ID (e.g., "my-app")
projectID := "<project-id>"
// Grant CAN_USE to a user (Update is additive and cannot downgrade)
_, err := w.Permissions.Update(ctx, iam.UpdateObjectPermissions{
RequestObjectType: "database-projects",
RequestObjectId: projectID,
AccessControlList: []iam.AccessControlRequest{
{
UserName: "user@example.com",
PermissionLevel: iam.PermissionLevelCanUse,
},
},
})
// Get current permissions
permissions, err := w.Permissions.Get(ctx, iam.GetPermissionRequest{
RequestObjectType: "database-projects",
RequestObjectId: projectID,
})