정밀 조정된 액세스 제어 대리석 샘플
마블 체인코드 애플리케이션을 사용하면 고유한 속성(이름, 크기, 색상 및 소유자)으로 자산(마블)을 생성하고 이러한 자산을 블록체인 네트워크의 동료 참여자와 거래할 수 있습니다.
이 예제 응용 프로그램에는 액세스 제어 목록 및 그룹으로 작업하여 함수를 특정 사용자로 제한하는 방법을 검토할 수 있는 다양한 기능이 포함되어 있습니다.
샘플 개요
샘플에 포함된 테스트 시나리오에는 자산을 관리하기 위한 다음 제한 사항이 포함되어 있습니다.
- 빨간색 대리석의 대량 전송은
"redMarblesTransferPermission"Fabric 속성이 있는 ID에서만 허용됩니다. - 파란색 대리석의 대량 전송은
"blueMarblesTransferPermission"Fabric 속성이 있는 ID에서만 허용됩니다. - 대리석의 삭제는
"deleteMarblePermission"Fabric 속성이 있는 ID에만 허용됩니다.
이러한 제한 사항은 fgMarbles_chaincode.go 체인 코드에서 다음 라이브러리 메소드를 구현하여 적용됩니다.
bulkMarblesTransferGroup라는 Fine-Grained ACL 그룹을 생성합니다. 이 그룹은 색상(대량 전송)에 따라 대리석을 전송할 수 있는 모든 ID를 정의합니다.createGroup(stub, []string{" bulkMarblesTransferGroup", "List of Identities allowed to Transfer Marbles in Bulk", "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})bulkMarblesTransferGroup에 대한 빨간색 대리석류 액세스의 대량 전송을 제공하는redMarblesAcl라는 세분화된 ACL을 만듭니다.createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})bulkMarblesTransferGroup에 대한 Blue Marbles 액세스 대량 전송을 제공하는blueMarblesAcl라는 Fine-Grained ACL을 생성합니다.createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})deleteMarbleAcl라는 Fine-Grained ACL을 생성하여"canDeleteMarble=true"Fabric 속성을 기반으로 대리석 삭제를 제한합니다.createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})marble라는 Fine-Grained ACL 리소스를 생성합니다. 이 리소스는 우리가 만든 다양한 ACL을 사용하여 제어됩니다.createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
선행 조건 및 설정
대리석류 샘플의 미세 조정된 액세스 제어 버전을 실행하려면 다음 단계를 완료합니다.
- 대리석 샘플의 미세 조정된 액세스 제어 버전을 다운로드합니다. 개발자 도구 페이지에서 샘플 창을 연 다음 세분화된 ACL이 있는 대리석 아래의 다운로드 링크를 누릅니다. 이 패키지는 marbles 샘플의
.zip파일(fgACL_MarbleSampleCC.zip), 샘플을 실행할 Node.js 파일(fgACL-NodeJSCode.zip) 및 세분화된 액세스 제어 라이브러리(Fine-GrainedAccessControlLibrary.zip)를 포함하는 압축을 풉니다. - Oracle Blockchain Platform에 배포할 체인코드 패키지를 생성합니다.
fgACL_MarbleSampleCC.zip파일의 내용을fgACL_MarbleSampleCC디렉토리로 추출합니다.fgACL_MarbleSampleCC디렉토리의 내용은fgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.go및go.mod파일과oracle.com디렉토리가 됩니다.- 명령행에서
fgACL_MarbleSampleCC디렉토리로 이동하고GO111MODULE=on go mod vendor를 실행합니다. 이 명령은 필요한 종속성을 다운로드하여vendor디렉토리에 추가합니다. fgACL_MarbleSampleCC디렉토리의 모든 내용(네 개의 Go 파일,go.mod파일,vendor및oracle.com디렉토리)을 ZIP 형식으로 압축합니다. 체인코드를 Oracle Blockchain Platform에 배포할 준비가 되었습니다.
- 빠른 배치 사용에 설명된 대로 업데이트된 샘플 체인코드 패키지(
fgACL_MarbleSampleCC.zip)를 설치하고 배치합니다. - 개발자 툴 페이지에서 애플리케이션 개발 창을 연 다음 지침에 따라 Node.js SDK를 다운로드합니다.
- 개발자 툴 페이지에서 애플리케이션 개발 창을 연 다음 개발 패키지 다운로드를 누릅니다.
- 샘플과 함께 다운로드한 Node.js 파일을 사용하여 개발 패키지를 동일한 폴더에 추출합니다.
network.yaml파일에서certificateAuthorities항목과 해당registrar항목을 찾습니다. 관리자 비밀번호는 다운로드 시network.yaml에서 마스크(***로 변환됨)됩니다. 이 샘플을 실행할 때 이 암호를 관리자의 일반 텍스트 암호로 바꿉니다.
- Oracle Blockchain Platform 인스턴스에 새 ID를 등록합니다.
- 테넌시에 매핑된 IDCS에서 IDCS(다음 단계에서
<NewIdentity>이라고 함)에 사용자를 생성합니다. - 이 사용자에게 인스턴스에 대한
CA_User애플리케이션 롤을 부여합니다.
- 테넌시에 매핑된 IDCS에서 IDCS(다음 단계에서
Fine-Grained Access Control 대리석 샘플 구현
다음 단계를 완료하여 새 사용자를 등록하고 제공된 Node.js 스크립트를 사용하여 ACL 제한을 구현합니다.
- 새 사용자 등록:
node registerEnrollUser.js <NewIdentity> <Password> - 초기화: 액세스 제어 목록을 초기화합니다.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization - 액세스 제어 목록, 그룹 및 리소스 만들기: 개요에 설명된 ACL 리소스를 만듭니다.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources - Create your test marble resources: This creates several test marble assets - blue1 and blue2 owned by tom, red1 and red2 owned by jerry, and green1 and green2 owned by spike.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
액세스 제어 테스트
액세스 제어 목록에서 올바른 사용자만 각 기능을 수행할 수 있는지 테스트하려면 일부 샘플 시나리오를 통해 실행하십시오.
- 대리석 이동: Tom에서 Jerry로 대리석
blue1을 전송합니다. 단일 대리석을 전송할 수 있는 사람에 대한 제한이 없으므로 성공적으로 완료됩니다.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - 관리 사용자로 대리석 전송: 대리석
blue1을 제리에서 스파이크로 전송합니다. 단일 대리석을 전송할 수 있는 사람에 대한 제한이 없으므로 이 작업도 성공적으로 완료됩니다.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike - 내역 가져오기:
blue1라는 대리석의 내역을 질의합니다. 그것은 먼저 제리로 옮겨진 다음 스파이크로 옮겨졌음을 반환합니다.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1 - 모든 빨간색 대리석 전송:
redMarblesAclACL은 새로 등록된 ID에 필요한"redMarblesTransferPermission=true"Fabric 속성이 있으므로 이 전송을 허용하므로 두 개의 빨간색 대리석이 tom으로 전송됩니다.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom - 관리 사용자로 모든 빨간색 대리석류 전송: 관리 ID에
"redMarblesTransferPermission=true"Fabric 속성이 없으므로redMarblesAclACL에서 이 전송을 차단합니다.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry - 모든 녹색 대리석 전송: 기본적으로 명시적으로 정의된 액세스만 허용됩니다. 녹색 대리석의 대량 전송을 허용하는 ACL이 없기 때문에 이것은 실패합니다.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom - 대리석 삭제: 새로 등록된 ID에 필수
"deleteMarblePermission=true"Fabric 속성이 있으므로deleteMarbleAclACL에서 이 삭제를 허용합니다.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - 관리 사용자로 대리석 삭제:
deleteMarbleAclACL은 관리 ID에 필요한"deleteMarblePermission=true"Fabric 속성이 없기 때문에 이 삭제를 방지합니다.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
샘플 파일 참조
이러한 테이블에는 체인 코드에서 사용할 수 있는 방법과 샘플에 포함된 응용 프로그램 파일이 나열됩니다.
fgMarbles_chaincode.go
| 함수 | 설명 |
|---|---|
initMarble |
대리석 만들기 |
transferMarble |
이름을 기반으로 한 소유자로부터 다른 소유자로 대리석 전송 |
createTestMarbles |
테스트 목적으로 샘플 대리석을 만들려면 initMarble를 호출합니다.
|
createFineGrainedAclSampleResources |
테스트 시나리오에 필요한 ACL(Fine-Grained Access Control List), 그룹 및 리소스를 생성합니다. |
transferMarblesBasedOnColor |
특정 색상의 여러 대리석을 다른 소유자에게 전송합니다. |
delete |
대리석류 삭제 |
readMarble |
이름을 기반으로 대리석류의 모든 속성을 반환합니다. |
getHistoryForMarble |
대리석에 대한 값 이력을 반환합니다. |
fgACL_Operations.go
| 메소드 | 매개변수 | 설명 |
|---|---|---|
getACL |
|
명명된 ACL을 가져오거나 모든 ACL을 읽습니다. 메소드를 호출하는 유저는 명명된 ACL에 대한 READ 액세스 권한을 가져야 합니다. |
createACL |
|
ACL을 만들려면 메소드를 호출하는 사용자에게 이름이 ". ACLs"인 부트스트랩 리소스에 대한 CREATE 액세스 권한이 있어야 합니다. 중복된 이름이 지정된 ACL은 허용되지 않습니다.
|
deleteACL |
|
메소드를 호출하는 유저는 명명된 ACL에 대한 DELETE 액세스 권한을 가져야 합니다. |
updateACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
addAfterACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
addBeforeACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
addPatternToACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
removePatternFromACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
updateDescription |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
removeBindACL |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
addAccess |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
removeAccess |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며, 명명된 ACL이 있어야 합니다. |
ACLInitialization |
|
이 기능은 세분화된 ACL 지원을 초기화하는 데 사용됩니다. |
fgGroups_Operations.go
| 메소드 | 매개변수 | 설명 |
|---|---|---|
getGroup |
|
name= 메소드를 호출하는 사용자는 이 그룹에 대한 READ 액세스 권한을 가져야 합니다. |
createGroup |
|
메소드를 호출하는 사용자는 부트스트랩 그룹 |
deleteGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 DELETE 액세스 권한을 가져야 합니다. |
addAfterGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
addBeforeGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
updateDescriptionForGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
removeBindAclFromGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
addMembersToGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
removeMembersFromGroup |
|
메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다. |
fgResource_Operations.go
| 메소드 | 매개변수 | 설명 |
|---|---|---|
createResource |
|
메소드를 호출하는 사용자는 이름이 ". Resources"인 부트스트랩 리소스에 대한 CREATE 액세스 권한을 가지고 있어야 합니다. 중복된 이름이 지정된 리소스는 허용되지 않습니다.
|
getResource |
|
메소드를 호출하는 사용자에게는 리소스에 대한 READ 액세스 권한이 있어야 합니다. |
deleteResource |
|
메소드를 호출하는 유저는 명명된 리소스에 대한 DELETE 액세스 권한을 가져야 합니다. |
addAfterACLInResource |
|
메소드를 호출하는 사용자는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다. |
addBeforeACLInResource |
|
메소드를 호출하는 사용자는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다. |
updateDescriptionInResource |
|
메소드를 호출하는 사용자는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다. |
removeBindACLInResource |
|
메소드를 호출하는 사용자는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다. |
checkResourceAccess |
|
메소드를 호출하는 현재 사용자에게 지정된 이름이 지정된 리소스에 대한 액세스 권한이 있는지 여부를 확인합니다. |