역할에 권한 또는 권한 그룹 부여하기
역할이 만들어지면 해당 역할에 권한을 부여할 수 있습니다. 이 가이드에서는 역할에 권한 또는 권한 그룹을 부여하는 방법을 소개합니다.
역할에 권한 또는 권한 그룹 부여하기
Milvus 2.5에서는 권한 부여 작업을 간소화하는 새로운 버전의 API가 도입되었습니다. 역할에 권한을 부여할 때 더 이상 개체 유형을 조회할 필요가 없습니다. 다음은 매개변수와 해당 설명입니다.
role_name: 권한 또는 권한 그룹을 부여해야 하는 대상 역할의 이름입니다.
리소스: 특정 인스턴스, 데이터베이스 또는 컬렉션이 될 수 있는 권한의 대상 리소스입니다.
다음 표에서는 client.grantV2() 메서드에서 리소스를 지정하는 방법을 설명합니다.
레벨 |
리소스 |
부여 방법 |
참고 |
|---|---|---|---|
컬렉션 |
특정 컬렉션 |
|
대상 컬렉션의 이름과 대상 컬렉션이 속한 데이터베이스의 이름을 입력합니다. |
특정 데이터베이스 아래의 모든 컬렉션 |
|
대상 데이터베이스의 이름과 와일드카드 |
|
데이터베이스 |
특정 데이터베이스 |
|
대상 데이터베이스의 이름과 와일드카드 |
현재 인스턴스 아래의 모든 데이터베이스 |
|
데이터베이스 이름으로 |
|
인스턴스 |
현재 인스턴스 |
|
데이터베이스 이름으로 |
권한: 역할에 부여해야 하는 특정 권한 또는 권한 그룹입니다. 현재 Milvus는 부여할 수 있는 56가지 유형의 권한을 제공합니다. 아래 표에는 Milvus의 권한이 나열되어 있습니다.
아래 표의 유형 열은 권한을 빠르게 조회할 수 있도록 사용자별로 구분한 것으로, 분류 목적으로만 사용됩니다. 권한을 부여할 때 유형을 이해할 필요는 없습니다. 해당 권한을 입력하기만 하면 됩니다.
유형
권한
설명
클라이언트 측의 관련 API 설명
데이터베이스 권한
ListDatabases
현재 인스턴스의 모든 데이터베이스 보기
DescribeDatabase
데이터베이스의 세부 정보 보기
CreateDatabase
데이터베이스 생성
DropDatabase
데이터베이스 삭제
데이터베이스 변경
데이터베이스 속성 수정
수집 권한
GetFlushState
컬렉션 플러시 작업의 상태를 확인합니다.
GetLoadState
컬렉션의 로드 상태 확인
GetLoadingProgress
컬렉션의 로딩 진행률 확인
컬렉션 표시
컬렉션 권한이 있는 모든 컬렉션 보기
ListAliases
컬렉션의 모든 별칭 보기
DescribeCollection
컬렉션의 세부 정보 보기
DescribeAlias
별칭의 세부 정보 보기
GetStatistics
컬렉션의 통계(예: 컬렉션의 엔티티 수)를 가져옵니다.
CreateCollection
컬렉션을 만듭니다.
DropCollection
컬렉션 삭제
Load
컬렉션 로드
릴리스
컬렉션 릴리스
Flush
컬렉션의 모든 엔티티를 봉인된 세그먼트에 유지합니다. 플러시 작업 후에 삽입된 모든 엔티티는 새 세그먼트에 저장됩니다.
압축
수동으로 압축 트리거
RenameCollection
컬렉션 이름 바꾸기
CreateAlias
컬렉션의 별칭을 만듭니다.
DropAlias
컬렉션의 별칭 삭제
FlushAll
데이터베이스의 모든 컬렉션을 플러시합니다.
파티션 권한
HasPartition
파티션 존재 여부 확인
ShowPartitions
컬렉션의 모든 파티션 보기
CreatePartition
파티션 만들기
DropPartition
파티션 삭제
인덱스 권한
IndexDetail
인덱스의 상세 정보 보기
CreateIndex
인덱스 생성
DropIndex
인덱스 삭제
리소스 관리 권한
LoadBalance
부하 분산 달성
CreateResourceGroup
리소스 그룹 생성
DropResourceGroup
리소스 그룹 삭제
리소스 그룹 업데이트
리소스 그룹 업데이트
DescribeResourceGroup
리소스 그룹의 세부 정보 보기
ListResourceGroups
현재 인스턴스의 모든 리소스 그룹 보기
TransferNode
리소스 그룹 간 노드 전송
TransferReplica
리소스 그룹 간 복제본 전송
BackupRBAC
현재 인스턴스에서 모든 RBAC 관련 작업에 대한 백업을 생성합니다.
BackupRBAC
RestoreRBAC
현재 인스턴스에 있는 모든 RBAC 관련 작업의 백업을 복원합니다.
RestoreRBAC
엔터티 권한
쿼리
쿼리 수행
검색
검색 수행
삽입
엔티티 삽입
삭제
엔터티 삭제
Upsert
엔터티 위로 삽입
가져오기
엔티티 대량 삽입 또는 가져오기
RBAC 권한
소유권 만들기
사용자 또는 역할 만들기
UpdateUser
사용자의 비밀번호 업데이트
DropOwnership
사용자 비밀번호 또는 역할 삭제
SelectOwnership
특정 역할이 부여된 모든 사용자 보기
소유권 관리
사용자 또는 역할을 관리하거나 사용자에게 역할을 부여합니다.
SelectUser
사용자에게 부여된 모든 역할 보기
권한 그룹 만들기
권한 그룹 만들기
DropPrivilegeGroup
권한 그룹 삭제
ListPrivilegeGroups
현재 인스턴스의 모든 권한 그룹 보기
권한 그룹 운영
권한 그룹에 권한을 추가하거나 권한 그룹에서 권한을 제거합니다.
다음 예는 default 데이터베이스 아래의 collection_01 에 대한 PrivilegeSearch 권한과 privilege_group_1 라는 권한 그룹을 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" \
-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" \
-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" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'
역할 설명하기
다음 예는 describe_role 메서드를 사용하여 role_a 역할에 부여된 권한을 보는 방법을 보여줍니다.
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" \
-d '{
"roleName": "role_a"
}'
다음은 출력 예시입니다.
{
"role": "role_a",
"privileges": [
{
"collection_name": "collection_01",
"db_name": "default",
"role_name": "role_a",
"privilege": "Search",
"grantor_name": "root"
},
"privilege_group_1"
]
}
역할에서 권한 또는 권한 그룹 해지하기
다음 예는 default 데이터베이스 아래의 collection_01 에 대한 권한 PrivilegeSearch 과 역할 role_a 에 부여된 권한 그룹 privilege_group_1 을 해지하는 방법을 보여줍니다.
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" \
-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" \
-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" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'