Conceder privilegios o grupos de privilegios a roles
Una vez creado un rol, puede concederle privilegios. Esta guía explica cómo conceder privilegios o grupos de privilegios a un rol.
Conceder un privilegio o un grupo de privilegios a un rol
Milvus 2.5 introduce una nueva versión de la API que agiliza la operación de concesión. Ya no es necesario buscar el tipo de objeto cuando se concede un privilegio a un rol. A continuación se indican los parámetros y las explicaciones correspondientes.
role_name: El nombre del rol de destino al que deben concederse privilegios o grupos de privilegios.
Recurso: El recurso de destino de un privilegio, que puede ser una instancia, base de datos o colección específica.
La siguiente tabla explica cómo especificar el recurso en el método client.grantV2().
Nivel |
Recurso |
Método de concesión |
Notas |
|---|---|---|---|
Colección |
Una colección específica |
|
Introduzca el nombre de la colección de destino y el nombre de la base de datos a la que pertenece la colección de destino. |
Todas las colecciones de una base de datos específica |
|
Introduzca el nombre de la base de datos de destino y un comodín |
|
Base de datos |
Una base de datos específica |
|
Introduzca el nombre de la base de datos de destino y el comodín |
Todas las bases de datos de la instancia actual |
|
Introduzca |
|
Instancia |
La instancia actual |
|
Introduzca |
Privilegio: El privilegio específico o grupo de privilegios que necesita otorgar a un rol. Actualmente, Milvus proporciona 56 tipos de privilegios que puede conceder. La siguiente tabla enumera los privilegios en Milvus.
La columna de tipo en la tabla de abajo es de usuario para facilitar su búsqueda rápida de privilegios y se utiliza sólo con fines de clasificación. Cuando conceda privilegios, no necesita entender los tipos. Sólo tiene que introducir los privilegios correspondientes.
Tipo
Privilegio
Descripción
Descripción de la API correspondiente en el lado del cliente
Privilegios de base de datos
ListDatabases
Ver todas las bases de datos de la instancia actual
DescribeDatabase
Ver los detalles de una base de datos
CrearBaseDeDatos
Crear una base de datos
SoltarBaseDeDatos
Eliminar una base de datos
AlterDatabase
Modificar las propiedades de una base de datos
Privilegios de recogida
GetFlushState
Comprobar el estado de la operación de vaciado de la colección
GetLoadState
Comprueba el estado de carga de una colección
GetLoadingProgress
Comprueba el progreso de carga de una colección
Mostrar colecciones
Ver todas las colecciones con privilegios de colección
ListAliases
Ver todos los alias de una colección
DescribirColección
Ver los detalles de una colección
DescribirAlias
Ver los detalles de un alias
ObtenerEstadísticas
Obtener las estadísticas de una colección (por ejemplo, el número de entidades de una colección)
CrearColección
Crear una colección
SoltarColección
Soltar una colección
Cargar
Cargar una colección
Liberar
Liberar una colección
Descargar
Persiste todas las entidades de una colección en un segmento sellado. Cualquier entidad insertada después de la operación flush se almacenará en un nuevo segmento.
Compactación
Compactación manual
RenombrarColección
Renombrar una colección
CrearAlias
Crear un alias para una colección
SoltarAlias
Eliminar el alias de una colección
VaciarTodas
Vaciar todas las colecciones de una base de datos
Privilegios de partición
TienePartición
Comprobar si existe una partición
MostrarParticiones
Ver todas las particiones de una colección
CrearPartición
Crear una partición
SoltarPartición
Soltar una partición
Privilegios de índice
Detalles del índice
Ver los detalles de un índice
CrearÍndice
Crear un índice
Soltar índice
Eliminar un índice
Privilegios de gestión de recursos
Equilibrio de carga
Lograr el equilibrio de carga
CrearGrupoDeRecursos
Crear un grupo de recursos
SoltarGrupoDeRecursos
Eliminar un grupo de recursos
ActualizarGrupoDeRecursos
Actualizar un grupo de recursos
DescribeResourceGroup
Ver los detalles de un grupo de recursos
ListResourceGroups
Ver todos los grupos de recursos de la instancia actual
TransferNode
Transferir nodos entre grupos de recursos
TransferReplica
Transferir réplicas entre grupos de recursos
Copia de seguridadRBAC
Crear una copia de seguridad de todas las operaciones relacionadas con RBAC en la instancia actual
BackupRBAC
RestaurarRBAC
Restaurar una copia de seguridad de todas las operaciones relacionadas con RBAC en la instancia actual
RestaurarRBAC
Privilegios de Entidad
Consulta
Realizar una consulta
Buscar en
Realizar una búsqueda
Insertar
Insertar entidades
Borrar
Borrar entidades
Subir
Insertar entidades
Importar
Insertar o importar entidades en bloque
Privilegios RBAC
CrearPropiedad
Crear un usuario o un rol
ActualizarUsuario
Actualizar la contraseña de un usuario
SoltarPropiedad
Dar de baja la contraseña de un usuario o un rol
Seleccionar titularidad
Ver todos los usuarios a los que se ha concedido una función específica
GestionarPropiedad
Gestionar un usuario o una función o conceder una función a un usuario
SeleccionarUsuario
Ver todos los roles concedidos a un usuario
CrearGrupoDePrivilegios
Crear un grupo de privilegios
SoltarGrupoDePrivilegios
Eliminar un grupo de privilegios
ListPrivilegeGroups
Ver todos los grupos de privilegios de la instancia actual
OperatePrivilegeGroup
Añadir o eliminar privilegios de un grupo de privilegios
El siguiente ejemplo demuestra cómo conceder el privilegio PrivilegeSearch en collection_01 bajo la base de datos default así como un grupo de privilegios denominado privilege_group_1 al rol role_a.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.grant_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "localhost:19530",
APIKey: "root:Milvus",
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "Search", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "privilege_group_1", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "ClusterReadOnly", "*", "*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "Search"
collection_name: 'collection_01'
db_name: 'default',
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "privilege_group_1"
collection_name: 'collection_01'
db_name: 'default',
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "ClusterReadOnly"
collection_name: '*'
db_name: '*',
});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "privilege_group_1",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'
Describir un rol
El siguiente ejemplo demuestra cómo ver los privilegios otorgados al rol role_a utilizando el método describe_role.
from pymilvus import MilvusClient
client.describe_role(role_name="role_a")
import io.milvus.v2.service.rbac.response.DescribeRoleResp;
import io.milvus.v2.service.rbac.request.DescribeRoleReq
DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
.roleName("role_a")
.build();
DescribeRoleResp resp = client.describeRole(describeRoleReq);
List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
import "github.com/milvus-io/milvus/client/v2/milvusclient"
role, err := client.DescribeRole(ctx, milvusclient.NewDescribeRoleOption("role_a"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
await client.describeRole({roleName: 'role_a'});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a"
}'
A continuación se muestra un ejemplo de salida.
{
"role": "role_a",
"privileges": [
{
"collection_name": "collection_01",
"db_name": "default",
"role_name": "role_a",
"privilege": "Search",
"grantor_name": "root"
},
"privilege_group_1"
]
}
Revocar un privilegio o un grupo de privilegios de un rol
El siguiente ejemplo demuestra cómo revocar el privilegio PrivilegeSearch en collection_01 bajo la base de datos default así como el grupo de privilegios privilege_group_1 que han sido otorgados al rol role_a.
client.revoke_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "Search", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "privilege_group_1", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "ClusterReadOnly", "*").
WithDbName("*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
await client.revokePrivilegeV2({
role: 'role_a',
privilege: 'Search',
collection_name: 'collection_01',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: 'collection_01',
privilege: 'Search',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: '*',
privilege: 'ClusterReadOnly',
db_name: '*'
});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'