2016-08-07 74 views
0

firebase를 처음 사용합니다. firebase 실시간 데이터베이스를 설정하고 읽기 및 쓰기 규칙이 true로 설정된 경우 읽기 및 쓰기가 가능합니다.이메일 및 비밀번호로 Firebase 데이터베이스 인증

인증에 문제가 있습니다 .i google과 이메일에 대한 인증 및 비밀번호를 설정했습니다.

내 목표는 모든 사용자가 데이터를 읽을 수있게하는 것이지만 하나의 이메일 주소와 비밀번호를 사용하여 로그인 한 후에는 한 명의 사용자 (본인) 만 데이터를 쓸 수 있습니다.

나는 성공적으로 읽을 수와 내가 구글로 로그인하면 데이터베이스에 쓰기 (로 설정 규칙 :! 인증 = NULL.)

내가 또한 읽고 (같은 규칙을 사용하여 데이터베이스에 기록 할 수 있습니다 auth! = null) 전자 메일 주소와 암호로 로그인하는 경우.

전자 메일 주소와 암호로 로그인 한 단일 사용자에 대해서만 쓰기 권한을 허용하도록 설정하는 방법을 모르겠습니다.

규칙에 사용자 노드를 포함 시키려고했지만 시뮬레이터를 사용할 때 액세스 할 수 없으며 (아래 참조) uid (로그인 후 얻을 수 있음)를 포함하는 방법을 알지 못합니다. - 참조를 구축이 참조가 내가 현재 (읽기와 함께 작동하는 true로 설정 규칙을 작성)를 사용할 수 있습니다 : 난 내 데이터베이스에서 사용자 노드를 포함하지 않은

DatabaseReference databaseReference = mRootReference.child("Action_helper/1/Action_table_of_contents"); 

그 촬영주의를 가정하고로 firebase 인증.

enter image description here

내가 여러 규칙 옵션을 사용하여 시뮬레이터를 시도 : 여기

내 데이터의 레이아웃입니다.

인증 { "제공": "중포 기지", "UID": "Rp3OgoaABMN3hqTv0aF29ECQRCQ2"}

참고 : (사용자 지정 공급자 옵션 선택) 시뮬레이터에서 이러한 설정을 사용하여 액세스를 테스트 내가 공급자와 UID에서 얻을

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if (user != null) { 
     // User is signed in 
     userId = user.getUid(); 
     String provider = user.getProviderId(); 

enter image description here

enter image description here

: 중포 기지 오브젝트 나 중포 기지 인증에 설정 한 이메일 주소와 비밀번호로 로그인 한 후

1) 내 규칙을 공식화하고, 2) 데이터 구조를 변경해야하는 경우 어떻게해야하며, 마지막으로 3) 데이터베이스 참조에 데이터를 쓰는 데 사용할 uid를 포함시키는 방법에 대해 도움을 주시면 감사하겠습니다. 데이터 베이스.

감사

답변

1

때문에, 규칙에서 정의하는 것은 도움이되지 것없는 사용자 노드가 없습니다. 우리는 규칙을 정의하지 않으면 다음이 Action_helper에서 거짓 즉,이에 대한 거짓입니다

{ 
     "rules": { 

     "Action_helper":{ 

      "$uid":{ 

       //user-based security 
       ".read": "auth != null && $uid === auth.uid", 
       ".write": "auth != null", 

      }//$uid 

     }//Action_helper 

    }// rules 
} 

기본적으로 규칙 위의 검사 : 나는 다음과 같은 일 것 일 수도 규칙 (0과 1 UID있는 가정을) 생각 읽기와 쓰기 모두.노드 uid (여기서 $는 와일드 카드를 나타냄)에서 일 때 로그인 한 사용자의 사용자 ID가이 노드의 uid와 동일한 지 확인하고 이에 따라 규칙을 정의합니다.

내가 매우 링크 The key to Firebase security - Google I/O 2016 통해 갈를 추천, 그것은 쉽게 따라, 많은 도움이 될 것입니다, 그리고 최선의 설명 지금까지 데모 예제를 발견했다.

데이터 레이아웃은 요구 사항과 화면에 따라 다릅니다. Firebase는 32 레벨의 중첩을 허용하지만 노드를 최대한 적게 중첩시키는 것이 좋습니다. 그리고 데이터 레이아웃에 대해 생각해 볼 또 다른 중요한 점은 우리가 노드를 통해 필드의 복사본을 만들어야 할지라도 가능한 한 비정규 화 된 데이터를 유지하는 것입니다.

는 각 자녀 추가에 유지할 수 있습니다 데이터베이스 참조에서 UID 포함하려면 : 그래서

DatabaseReference databaseReference = mRootReference.child("Action_helper).child(uid).child("Action_table_of_contents"); 

을, 우리가 아이 "Action_helper"에 대한 루트 노드에서 참조하고 그 아래로 더가는 일치 자녀의 UID 및 그 uid의 자식 "Action_table_of_contents"를 참조하고 있습니다.

0

도움 주셔서 감사합니다. 나는 그럭저럭 일할 수 있었다 (부분적으로). 그러나 나는 그것을 올바르게하고있다라고 확신하지 않는다. 여기 내 (내가 이름을 변경 한) 데이터 구조입니다 - 하나 개의 사용자 노드 (인증 UID를 사용하여이)가, 데이터 포함 된 두 개의 자식 노드 :

enter image description here 여기

와 내 규칙입니다을 :

enter image description here

은 본질적으로 그것은 시뮬레이터에서 작동하지만 코드에서, 내가 로그인 읽고 쓸 수 있어요. 하지만 이제는 문제가 생겼습니다. 쿼리 참조에 전달 된 uid가 null 인 경우 uid로 더미 값을 넣으면 데이터에 전혀 액세스 할 수 없습니다 (데이터가 아래에 있으므로 users/the_valid_uid 노드와 더미 uid가 the_valid_uid와 일치하지 않습니다.

그렇다면 유효한 사용자의 uid를 하드 코딩하지 않고 데이터베이스 참조를 작성하려면 어떻게해야합니까? 그래서 Addiction_items 및 table_of_contents_items 노드의 데이터에 액세스 할 수 있습니다 (내 목표는 두 노드에서 누구나 데이터를 읽을 수 있도록 허용하지만 한 사용자 (내 자신)가 내 전자 메일 주소로 로그인 한 후에 두 노드에 모두 쓸 수 있도록 허용하는 것입니다. ?와 비밀번호

감사

+0

이동하십시오 ".read". 노드는이 사람이 다른 모든 자식 노드까지 루트 노드에서 읽을 수 있습니다 : "규칙"노드 즉, 오른쪽 아래에 배치하는 것이 "사실" – 0p3n5ourcE

+0

인증을 위해 시뮬레이터에서 시도해 볼 수 있습니다. – 0p3n5ourcE

+0

도움을 청하기 위해 @openSource와 firebase youtube 권장 사항에 대한 링크를 보내 주시면 감사하겠습니다. 유용한. 마침내 그것을 의도대로 작동 시켰습니다. $ uid === '전자 메일 로그인 uid'는 전자 메일 로그인 만 사용자 폴더에 쓸 수 있도록 작성 규칙을 작성합니다 (그렇지 않으면 로그인 사용자가 거기에 쓸 수 있습니다). –

관련 문제