항목에 대한 액세스 권한이 있는 사용자만 검색 결과 내에서 해당 항목을 볼 수 있도록 하려면 기업 저장소의 액세스 제어 목록 (ACL)으로 항목의 색인을 생성해야 합니다. 저장소 항목의 색인을 생성할 때 저장소의 ACL을 모델링하고 이 ACL을 포함해야 합니다. 콘텐츠 커넥터 SDK에는 강력하고 다양한 ACL 메서드 집합이 있어 거의 모든 저장소의 ACL을 모델링할 수 있습니다.
ACL 만들기
ACL을 만드는 프로세스는 두 단계로 이뤄집니다.
- ACL 클래스의 정적 메서드를 사용하여
Principal
를 만듭니다. Acl.Builder
클래스를 사용하여 주 구성원을 사용하여 ACL을 빌드합니다.
이 문서의 나머지 부분에서는 상속, 포함과 같이 ACL 모델링과 생성을 위해 필수적으로 이해하고 있어야 하는 개념에 대해 설명합니다.
외부 ID를 사용하여 주 구성원 만들기
Google Cloud Search에서는 사용자와 그룹을 Google 이메일 주소로 확인 합니다. 저장소 항목 색인을 생성하면 콘텐츠 커넥터에 이러한 이메일 주소가 없을 수 있습니다. 그러나 콘텐츠 커넥터 SDK를 사용하면 이메일 주소 대신 외부 ID (저장소 항목에 대한 액세스 권한을 사용자 또는 그룹에 부여하는 ID)를 사용하여 항목 색인을 생성할 수 있습니다. getUserPrincipal()
메서드 또는 getGroupPrincpal()
메서드를 사용하여 외부 ID가 포함된 주 구성원을 만듭니다. ACL
클래스에는 Principal
객체를 빌드하는 데 사용되는 다른 여러 정적 메서드가 있습니다.
ACL 상속
ACL 상속은 항목의 ACL과 상속 체인의 ACL 조합 결과에 따라 특정 항목 또는 사용자를 승인하는 것을 의미합니다. 승인 결정을 내리는 데 사용되는 규칙은 저장소와 항목의 속성에 따라 다릅니다.
상속 설정
각 항목에는 setReaders()
및 setDeniedReaders()
메서드를 사용하여 지정된 직접 허용된 주 구성원 및 직접 거부된 주 구성원이 있을 수 있습니다. 직접 허용된 주 구성원은 특정 항목에 직접 액세스 할 수 있다고 ACL에서 식별된 사용자입니다. 직접 거부된 주 구성원은 특정 항목에 액세스할 수 없다고 ACL에서 식별된 사용자입니다.
setInheritFrom()
메서드를 사용하여 간접 허용된 주 구성원과 간접 거부된 주 구성원을 상속할 수도 있습니다. 간접 허용된 주 구성원은 ACL 상속을 통해 특정 항목에 간접적으로 액세스할 수 있는 사용자입니다. 간접 거부된 주 구성원은 ACL 상속을 통해 특정 항목에 액세스할 수 없는 사용자입니다.
그림 1에서는 setInheritFrom()
메서드를 사용하여 간접 허용된 주 구성원과 간접 거부된 주 구성원을 상속하는 방법을 보여줍니다.
그림 1은 다음과 같은 액세스 제어를 설명합니다.
- 사용자 1은 항목 A의 직접 허용된 주 구성원입니다.
- 사용자 2는 항목 B의 직접 허용된 주 구성원입니다.
- 항목 B는 항목 A의 ACL을 상속합니다.
이러한 액세스 제어에 따른 액세스 규칙은 다음과 같습니다.
- 사용자 1은 항목 B의 간접 허용된 주 구성원이 되기 위해 명시적으로 항목 B의 주 구성원으로 지정될 필요는 없습니다. 사용자 1은 항목 A의 직접 허용된 주 구성원으로 나열되고 항목 B가 항목 A의 ACL을 상속하므로 액세스 권한이 상속됩니다.
- 사용자 2는 항목 A의 간접 허용된 주 구성원이 아닙니다.
상속 유형 설정
setInheritFrom()
메서드를 사용하여 상속을 설정하는 경우 setInheritanceType()
메서드를 사용하여 상속 유형을 설정해야 합니다. 상속 유형은 하위 요소의 ACL이 상위 요소의 ACL과 결합되는 방법을 결정합니다. Acl.InheritanceType
는 다음과 같은 세 가지 상속 유형을 구현합니다.
BOTH_PERMIT
- 상속 유형을BOTH_PERMIT
으로 설정하면 하위 항목의 ACL과 상속된 상위 항목 ACL 모두에서 사용자의 항목 액세스가 허용된 경우에만 사용자에게 항목에 대한 액세스 권한이 부여됩니다.CHILD_OVERRIDE
- 상속 유형을CHILD_OVERRIDE
로 설정하면 하위 항목의 ACL과 상속된 상위 항목의 ACL이 충돌하면 하위 항목의 ACL이 상속된 상위 항목의 ACL보다 우선적으로 적용됩니다. 따라서 상위 항목의 ACL에서 사용자의 액세스가 거부된 리더로 인해 거부되더라도 사용자에게 하위 항목에 대한 리더 권한이 있으면 계속 액세스할 수 있습니다. 이와 반대로 상위 항목의 ACL에서 사용자에게 액세스 권한이 부여되더라도 사용자가 하위 항목의 거부된 리더라면 액세스할 수 없습니다.PARENT_OVERRIDE
- 상속 유형을PARENT_OVERRIDE
로 설정하면 상위 항목의 ACL과 하위 항목의 ACL이 충돌하면 상위 항목의 ACL이 하위 항목의 ACL보다 우선적으로 적용됩니다. 따라서 하위 항목의 ACL에서 사용자의 액세스가 거부된 리더로 인해 거부되더라도 사용자에게 상위 항목에 대한 리더 권한이 있으면 계속 액세스할 수 있습니다. 이와 반대로 하위 항목의 ACL에서 사용자에게 액세스 권한이 부여되더라도 사용자가 상위 항목의 거부된 리더라면 액세스할 수 없습니다.
ACL 상속 체인을 평가할 때 평가 순서에 따라 승인 결과가 바뀔 수 있습니다. Cloud Search는 ACL 상속 체인에 리프-루트(leaf-to-root) 평가 순서를 제공합니다. 특히 체인의 ACL 결정은 상위 요소가 있는 하위 요소의 평가로 시작하여 루트 상위 요소까지 진행될 수 있습니다.
예를 들어 하위 항목에 CHILD_OVERRIDE
상속 유형이 있고 사용자가 하위 항목에 액세스할 수 있는 경우 Drive는 상위 항목을 평가할 필요가 없습니다.
그러나 하위 요소에 PARENT_OVERRIDE 또는 BOTH_PERMIT가 있는 경우 Drive는 체인 위로 상속을 계속 평가합니다.
포함 및 항목 삭제
항목의 색인을 생성할 때 IndexingItemBuilder
클래스의 setContainer()
메서드를 사용하여 항목을 컨테이너로 라벨할 수 있습니다. 컨테이너/컨테이너 관계는 항목의 물리적 계층 구조를 설정하며 항목이 적절히 삭제되도록 보장합니다.
컨테이너를 삭제하면 포함된 항목도 함께 삭제됩니다.
포함 관계는 ACL 상속 규칙과는 완전히 별개입니다. 예를 들어 파일 시스템의 파일은 삭제 목적으로 폴더에 포함될 수 있지만 다른 폴더에서 ACL을 상속합니다. ACL을 상속하는 항목이 폴더의 포함 계층 구조에 있지 않는 한 폴더를 삭제해도 이 항목은 삭제되지 않습니다.
그림 2는 다음과 같은 액세스 제어를 설명합니다.
- 사용자 1은 항목 A의 직접 허용된 주 구성원입니다.
- 사용자 2는 항목 B의 직접 허용된 주 구성원입니다.
- 사용자 3은 항목 C의 직접 허용된 주 구성원입니다.
- 항목 C는 항목 A의 ACL을 상속합니다.
- 항목 B는 항목 A를 자신의 컨테이너로 명명합니다.
- 항목 C는 항목 B를 자신의 컨테이너로 명명합니다.
이러한 액세스 제어에 따른 액세스 규칙은 다음과 같습니다.
- 간접 액세스 권한이
setInheritFrom()
메서드에서 제공됩니다. 따라서 항목 C가 항목 A의 ACL을 상속하므로 사용자 1이 항목 C에 액세스할 수 있습니다. - 간접 액세스 권한이 항목 B에 포함된 항목 C에서 제공되지 않습니다. 따라서 사용자 2가 항목 C에 액세스할 수 없습니다.
포함 계층 구조에서 ACL 상속이 분리되므로 다양한 기존 구조를 모델링할 수 있습니다.
항목을 삭제하면 다음과 같은 결과가 발생합니다.
- 삭제된 항목이 포함된 모든 항목을 검색할 수 없게 되며, Google의 데이터 소스에서 삭제가 예약됩니다.
setInheritFrom()
메서드를 사용하여 삭제된 항목을 지정한 모든 항목을 검색할 수 없게 됩니다.
리소스에 setInheritFrom()
메서드를 사용하여 삭제된 항목이 있지만 setContainer()
를 사용하여 설정된 컨테이너가 없거나 포함 계층 구조에 삭제된 항목이 없으면 해당 항목과 데이터는 Google의 데이터 소스에 남아 있습니다. 개발자가 항목을 삭제할 수 있습니다.
그림 3은 항목 계층 구조에서 삭제가 작동하는 예시입니다.
그림 3은 다음과 같은 액세스 제어를 설명합니다.
- 사용자 1은 항목 A의 직접 허용된 주 구성원입니다.
- 사용자 2는 항목 D의 직접 허용된 주 구성원입니다.
- 항목 D와 항목 E 모두 항목 A의 ACL을 상속합니다.
- 항목 D는 항목 A를 자신의 컨테이너로 명명합니다.
- 항목 A와 항목 E는 컨테이너 항목이 없는 루트 수준 항목입니다.
삭제 작업은 컨테이너 참조 관계를 통해 전파됩니다. 항목 A를 삭제하면 다음과 같은 결과가 발생합니다.
- 모든 사용자가
setInheritFrom()
참조의 모든 하위 요소에 액세스할 수 없습니다. - 어떠한 사용자도 항목 A에 액세스할 수 없습니다.
- 항목 D는 암묵적으로 삭제됩니다. 어떠한 사용자도 항목 D에 액세스할 수 없습니다.
- 삭제 작업은 컨테이너 참조를 통해서만 삭제되므로 항목 E는 삭제되지 않습니다.
- 항목 E에 연결할 수 없게 되며 어떠한 사용자도 항목 E를 검색할 수 없습니다.