2017-02-14 1 views
0

Firebase를 사용하여 생성하는 iOS 앱에서 각 사용자는 이메일과 비밀번호로 가입 한 후 고유 한 사용자 이름을 만듭니다. [email protected]의 이메일을 가진 사용자가 다음 가입 및 더라면 왜이 Firebase 데이터베이스 보안 규칙은 && 및 || 작동하지 않음

그래서 다음과 같이 데이터베이스의 조각이 될 것이다 사용자 이름의 데이터베이스에없는 고유 한 사용자 이름을 만들 수 있었다 :

"usernames" : { 
     "test" : "r6KPesUr1qORfIJke07SloZHeNW2", 
     "test1" : "jSMSkY9rHtdNkXoLrsFmCAXdY9n2", 
     "test7" : "jnFhJbgCjZeJFx0hspObqoskQej2", 
     "test8" : "HtnULzU0lnZKYva2M2Wepl6N8wE3" 
    }, 

    "users" : { 
     "HtnULzU0lnZKYva2M2Wepl6N8wE3" : { 
      "email" : "[email protected]", 
      "username" : "test8" 
     }, 
     "boX6rtJ98haWVxNoXfSq21maCVU2" : { 
      "email" : "[email protected]" 
     }, 
     "jSMSkY9rHtdNkXoLrsFmCAXdY9n2" : { 
      "email" : "[email protected]", 
      "username" : "test1" 
     }, 
     "jnFhJbgCjZeJFx0hspObqoskQej2" : { 
      "email" : "[email protected]", 
      "username" : "test7" 
     }, 
     "r6KPesUr1qORfIJke07SloZHeNW2" : { 
      "email" : "[email protected]", 
      "username" : "test" 
     } 
    } 

사용자가 가입을 완료했을 때 고유 한 사용자 이름인지 확인하기 위해 다음과 같은 보안 규칙이 있습니다. 내가

(!root.child('usernames').hasChild($username.toLowerCase()) && 
    newData.val() == auth.uid && 
    root.child('users').hasChild(auth.uid)) 

을 거랑해야하기 때문에이 세 가지 진술을하고 싶은 유효성 검사 규칙에 대한이 두 문을

// USERNAMES 
    "usernames": { 
     ".read": "auth.uid != null", 
     ".write": "auth.uid != null", 
     "$username": { 
      ".validate": "(!root.child('usernames').hasChild($username.toLowerCase()) && newData.val() == auth.uid && 
          root.child('users').hasChild(auth.uid)) && 

          (root.child('users/'+auth.uid+'/username').val().toLowerCase() == $username || 
          !root.child('users/'+auth.uid+'/username').exists())"     
     }         
    } 

그들 중 하나

"(root.child('users/'+auth.uid+'/username').val().toLowerCase() == $username || 
    (!root.child('users/'+auth.uid+'/username').exists()" 

그렇다면 사실이있다 사용자가 test5으로 가입하려면 다음 json과 사용자 이름을 입력하십시오. 그러면 현재 보안 규칙의 첫 번째 부분으로 인해 작동하지 않습니다. OR 진술.

 "users": { 
     "boX6rtJ98haWVxNoXfSq21maCVU2": { 
       "username": "test5" 
      } 
    } 

내가 뭘 잘못하고 있니?

+0

규칙을 분석하는 것은 상당히 어렵습니다. 이 유효성 검사 규칙에 의해 거부 될 수있는 최소 코드를 포함하도록 질문을 편집 할 수 있습니까? –

+0

@FrankvanPuffelen 확실한 것. 필자는 데이터베이스가 어떻게 보이는지, json이 [email protected] – Edward

+0

OK라는 이메일을 사용하여 사용자의 고유 한 사용자 이름을 작성하는 데 실패한 것을 추가했습니다. 나는 당신의 유스 케이스를 알아내는 것을 시도했다. 그러나 이러한 복잡한 규칙을 이해하는 것은 까다로울 수 있으므로 특정 유스 케이스 하나를 격리하고 이에 초점을 맞 춥니 다. –

답변

1
사용자 이름 항에 사용자에 대해 발생하는 두 가지 일을 할 것 같다

:

노드는
  • 이 노드가 자신의 UID와 /usernames/$username에서 기록 된 사용자 이름과 /users/$uid/username에서 작성

    작성한 JSON 코드는 현재 # 1만을 포함합니다. /usernames 아래에 사용자 이름을 쓰는 것에 대해서는 아무것도 포함하지 않습니다. 따라서 사용자 이름이 존재해야하며 해당 사용자에 대해 소유권을 주장해야한다는 것을 확인하기 때문에 규칙에서 거부합니다.

    "users/boX6rtJ98haWVxNoXfSq21maCVU2/username": "test5", 
    "usernames/test5": "boX6rtJ98haWVxNoXfSq21maCVU2" 
    

    규칙은 다음과 같습니다 :

    당신은 아마 여러 위치 업데이트와 같은 것이 동시에 발생하는 # 1과 #을, 유효성을 검사 할

    "usernames": { 
        "$username": { 
        ".validate": "!data.exists() && 
         newData.exists() && 
         newData.parent().parent().child('users').child(auth.uid).child('username').val() === $username" 
        }         
    } 
    "users": { 
        "$uid": { 
        "username": { 
         ".validate": "!data.exists() && 
         newData.exists() && 
         newData.parent().parent().parent().child('usernames').child(newData.val()).val() === $uid" 
        } 
        } 
    } 
    

    소문자에 대한 정보는 삭제 했으므로 코드에서 수정하고 소문자 사용자 이름 만 저장하는 것이 더 쉽습니다.

  • +0

    "사용자"와 "사용자 이름"의 끝 규칙에 대해 newData()에서 대괄호를 제거해야한다고 생각합니다. – Edward

    +0

    내가 무슨 뜻인지 이해가 잘 모르겠습니다. 언제든지 편집을 제안 할 수 있습니다. –

    관련 문제