2017-05-09 14 views
2

사용자에게 역할이있는 Firebase에 상황이 있습니다. 이미 다른 "스키마"에 정의 된 일부 프로파일에 따라 사용자는 삭제, 업데이트, 생성, 삭제 및 업데이트 등을 할 수 있습니다. 많은 조합이 이루어집니다.Firebase가 사용자에게 역할을 설정했습니다.

예는 : "에 .write의 허락 동적 조건에 동의하지 않는 한 번 중포 기지에서이를 관리하는 방법

Users/: 
    user_1: 
     create: "ok" 
     delete: "no" 
     update: "ok" 
    user_2: 
     create: "no" 
     ... etc ... 

? 좀 별칭이 볼트 ( 생성(), 갱신() 발견 , 당신이 단지 또는 삭제 또는 업데이 트를 만들 수있다, 그러나 그에게)) (을 삭제합니다. 하나가 정의 된 후에는 변경할 수 없습니다.

감사합니다

+0

어쩌면 사용자마다 리눅스 chmod 스타일 필드를 만들고 그 방법으로 권한을 만들려고합니까? 이렇게하면 한 필드 만 있고 모든 조합을 권한에 한 번 정의 할 수 있습니다. –

+0

정확하게 말하자면, Bolt는 실험적 보안이며 컴파일러의 규칙이며 베타 버전입니다. – Mario

+0

안녕하세요 @PrestonGarno. 네,이 작품. 역할을 복구 할 수는 있지만 역할을 나타내는 조건에 부합하는 부분은 내가 할 수있는 아이디어가 없습니다. 777이나 765 등의 역할을 복구 할 수는 있지만 firebase에서 .write에 대한 규칙을 변경할 수는 없습니다. – Mario

답변

2

나는 해결책을 찾았습니다 ... 아무리 좋은 아이디어라도 ... 그러나 내 문제를 해결하십시오. 어쨌든, 조건을 쓰는 것은 조금 고통 스럽습니다.


다음 중포 기지 규칙에

users roles"

:

firebase rules

CUD 수단 C reate U pdate D elete. chmod 번호도 사용할 수 있습니다 (777, 765 등).

는 지금, 나는 등, :

+0

그럴 수도 있지만 엉망이 될 수도 있습니다. 내 해결책을보고 당신이 생각하는 것을 알려주십시오. 좀 더 유연 해 보였기 때문에 필자는 'per-amain'노드 권한 구조의 경로를 선호했다. 기억하십시오 - 많은 항목이있는 것을 두려워하지 마세요 - 반 직관적 인 것처럼 보이지만 DB는 모든 곳에 뿌려 지도록 설정되어 있습니다. 쉬운 유지 관리/구성을 허용합니다. –

3

좋아 -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 개월 전 이었지만 지금은 단순하거나 간단한 도구/라이브러리가 존재하는지 잘 모르겠습니다. 희망이 도움이!

+0

답장을 보내 주셔서 감사합니다 !!! 나는 신중하게 살펴볼 것이다. 어쨌든, 나는 방금 (지금까지) 나를 위해 일하는 해결책을 추진했다. – Mario

+0

@Mario 아무 문제 없어, 당신이 그것을 어느 정도 이해할 수 있기를 바랍니다. 그리고 이것이 당신을 위해 작동한다면, 그것을 올바르게 표시하는 것을 잊지 마세요 :) 행운을 빌어 요. –

+0

@Mario 분명히 잊어 버린 한 가지 :'permissions' 노드는 "/ messages/permissions"(주 노드 바로 아래)에 있습니다. * 모든 단일 메시지 대화에 대한 규칙을 정의합니다 *.그리고 나서'user'와'group' 노드는 chat * 단위로 존재하기 때문에/messages//users와/messages//group이됩니다. , 메시지 채팅 당 1 개. 제 루트 규칙이 틀렸다고 생각합니다. 이유는 분명합니다. –

관련 문제