좋아 -ud의 조건을 쓰기 --d하는 방법을 발견해야합니다, 그래서 데이터가 다음과 같이 구조화되어 있다고 가정하겠습니다. 이 대답은 DB의 다른 부분에 액세스하는 사용자를 동적으로 관리하는 방법에 대한 필자의 주관적인 접근 방식입니다.
참고 :: I가 약자를 사용하는 chmod를 읽기 - 쓰기 - EXECUTE 대신, 읽기 - 쓰기가-삭제 (즉 6 = 7 = 전체 CRUD 권한을 삭제 읽기 + 쓰기 아니지만). 이 샘플 DB는 3 부분으로 구성되어 있으며 소셜 미디어 앱을 모델링합니다. .
root/
|
|-- user/ <-main node that contains profile info
| \uid <-node name - one for each user with sub-nodes containing profile info
| \user
| |-<UID> <-shows who has "user" privileges (1st digit)
| \group
| |-<UID> <-shows who has "group" privileges (1st digit)
| \permissions = 744 <-universal "user" entry rule
|
|-- trending/ <-node that contains global, read only info
| \user <-No one will be here for "trending"
| \group
| \feed-data
| \<POST_UUIDS> <-Data here
| \permissions = 444 <-Everyone can read the global feed
|
|-- messaging/
| \<chat-uuid-number-1>
| \user
| |-<User1>
| |-<User2>
| \group
| \messages node
| \<chat-uuid-number-2>
| \user
| |-<User8>
| |-<User5>
| \messages-node
|
| \permissions = 600 <-Only 2 users can read&send messages in their node
|
|-- chatrooms/ <-each node contains a list of UID, and list of messages
| \<room-uuid-number>
| \user
| |-<Admin1>
| |-<Admin2...>
| \group
| |-<uid1>
| |-<uid2>
| |-<uid3...infinity>
| \permissions = 760 <-Only admins have user privilege, users in chat can send and receive in the chat though
JSON 데이터베이스가 분명히 해야하는 같은이 다소 denormalized
데이터베이스 구조입니다 : 또한, 3 자리 ("세계"에 대한 기본 가능성이 가장 높은 사용자 만 인증 될 것입니다 이것은 매우 간단한 예제 여기에서 읽으십시오 : https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html 각 브랜치는 관련 정보를 제외하고는 많은 정보를 보유하지 않습니다. 이제 "상속"유형 구조가 통일 된 경우 상대 디렉토리 경로를 사용하여 디렉토리를 기준으로 확인할 수 있습니다 사용자가 루트에서 한 곳에서 유효성 검사 규칙에 액세스하여 격리하려고 시도하면 모든 기본 노드가 기본 사용 권한에 대해 균일 한 구조를 가지고있는 한 모든 자식 노드가 적용됩니다!
새 데이터가 루트 디렉토리 또는 아래에 있지 않으면 (이 규칙도 작성할 수있는 규칙을 작성할 수 있음), data.parent()를 사용하여 당신의 엔트리의 부모 인 다음 parent()를 다시 호출하여 주 디렉토리 (예 :다음 검사)
".write": "data.parent().parent().child('permissions').val().beginsWith('6') && data.parent().child('users').child($uid).exists"
이 (의사 권한 코드의 첫 번째 숫자를 확인하고 : 채팅방), 당신은 사용자/그룹/세계의 목록에 대해 권한 각 연속 번호 값과 일치 확인 노드의 "users"하위 디렉토리로 이동하여 현재 사용자가 특정 하위 노드에 대한 사용자 권한을 가지고 있는지 확인합니다. 조건부 OR을 추가하여 group
쓰기 권한이 있는지 확인하고 사용자가 그룹에 있는지 확인하십시오. 그리고 루트 디렉토리의 모든 것들! '/'또는 '//'아래에 쓰지 않도록주의하십시오. ('& &'을 사용하여 먼저 조건문을 작성하십시오. 따라서 루트의 부모를 얻으려고 시도하기 전에 검사가 실패합니다.) 그러면 잘 작동합니다.
이것은 절대적인 구조는 아니지만 "얕은"데이터베이스가되도록 설정하고 "메시지"와 같은 주요 디렉토리 아래의 각 항목을 사용 권한 코드를 가지고 사용자의 UID를 확인하도록 제한하면서 설정합니다 DB는 읽기/쓰기가 가능하고, 고통을 덜어주었습니다. 마지막으로 사용한 것은 약 5 개월 전 이었지만 지금은 단순하거나 간단한 도구/라이브러리가 존재하는지 잘 모르겠습니다. 희망이 도움이!
어쩌면 사용자마다 리눅스 chmod 스타일 필드를 만들고 그 방법으로 권한을 만들려고합니까? 이렇게하면 한 필드 만 있고 모든 조합을 권한에 한 번 정의 할 수 있습니다. –
정확하게 말하자면, Bolt는 실험적 보안이며 컴파일러의 규칙이며 베타 버전입니다. – Mario
안녕하세요 @PrestonGarno. 네,이 작품. 역할을 복구 할 수는 있지만 역할을 나타내는 조건에 부합하는 부분은 내가 할 수있는 아이디어가 없습니다. 777이나 765 등의 역할을 복구 할 수는 있지만 firebase에서 .write에 대한 규칙을 변경할 수는 없습니다. – Mario