Android:实时 Firebase 规则
Android: realtime Firebase Rules
我想知道如何保护我的规则。我尝试在读写中使用auth.uid != null
。
但是,如果新用户尝试登录或创建新帐户,它将不会成功并拒绝授予我权限。
我想保护用户并限制用户本人及其数据的读取:
我尝试使用 auth.uid != null
但已经注册的用户将无法登录,新用户也无法创建帐户。所以我必须使 public 写入和读取为真。有什么解决办法吗?
因为甚至 auth.uid != null ,经过身份验证的用户可以读取所有用户的全部数据,而不仅仅是他自己
这是我的规则副本:
{
"rules": {
".write": "root.child('Admins').child(auth.uid).exists()",
"Admins": {
".read": true,
".write": false
},
"Users": {
".read": true,
".write": true
},
"PrivateWork": {
".read": "auth.uid != null",
".write": false
},
"Likes": {
".read": "auth.uid != null",
".write": "auth.uid != null"
},
"Work": {
".read": "auth.uid != null",
".write": false
},
"videos": {
".read": "auth.uid != null",
".write": false
}
}
}
注册活动:
//Check if num already exist
binding.continueBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (binding.phoneNumBox.getText().toString().isEmpty()) {
binding.phoneNumBox.setError(getString(R.string.please_enter_phone));
} else if (binding.phoneNumBox.getText().toString().length() < 6) {
binding.phoneNumBox.setError(getString(R.string.enter_valid_phone));
} else {
DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Users");
userRef.orderByChild("phoneNumber")
.equalTo(binding.phoneNumBox.getText().toString())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Toast.makeText(RegPhoneNumActivity.this, getString(R.string.already_exist), Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(RegPhoneNumActivity.this, OTPActivity.class);
intent.putExtra("phoneNumber", binding.phoneNumBox.getText().toString());
startActivity(intent);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
登录活动:
//Check if num already exist
binding.loginContinueBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (binding.loginPhoneNumBox.getText().toString().isEmpty()) {
binding.loginPhoneNumBox.setError(getString(R.string.please_enter_phone_numb));
} else if (binding.loginPhoneNumBox.getText().toString().length() <= 6) {
binding.loginPhoneNumBox.setError(getString(R.string.plaese_enter_valid_phone_num));
} else {
userRef.orderByChild("phoneNumber")
.equalTo(binding.loginPhoneNumBox.getText().toString())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Intent intent = new Intent(PhoneLoginActivity.this, LoginVerifyPhoneActivity.class);
intent.putExtra("phoneNumber", binding.loginPhoneNumBox.getText().toString());
startActivity(intent);
} else {
Toast.makeText(PhoneLoginActivity.this, getString(R.string.phone_num_doesnt_exist), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
要允许用户仅读取他们自己的数据,您需要:
- 使用用户的 UID 作为他们节点的 key。
- 安全访问,如 content-owner only access 上的文档所示。
对于意味着您的 Users
节点变成这样的规则:
"Users": {
"$uid": {
".read": "$uid === auth.uid"
}
},
然后访问它的代码变为:
userRef.child(FirebaseAuth.getInstance().getCurrentUser().getUID())
.addListenerForSingleValueEvent(new ValueEventListener() {
虽然 也可以根据数据库中节点的值检查登录用户的 phone 号码,但用户也将拥有已经登录。如果是这种情况,请查看 securely querying data.
上的文档
我想知道如何保护我的规则。我尝试在读写中使用auth.uid != null
。
但是,如果新用户尝试登录或创建新帐户,它将不会成功并拒绝授予我权限。
我想保护用户并限制用户本人及其数据的读取:
我尝试使用 auth.uid != null
但已经注册的用户将无法登录,新用户也无法创建帐户。所以我必须使 public 写入和读取为真。有什么解决办法吗?
因为甚至 auth.uid != null ,经过身份验证的用户可以读取所有用户的全部数据,而不仅仅是他自己
这是我的规则副本:
{
"rules": {
".write": "root.child('Admins').child(auth.uid).exists()",
"Admins": {
".read": true,
".write": false
},
"Users": {
".read": true,
".write": true
},
"PrivateWork": {
".read": "auth.uid != null",
".write": false
},
"Likes": {
".read": "auth.uid != null",
".write": "auth.uid != null"
},
"Work": {
".read": "auth.uid != null",
".write": false
},
"videos": {
".read": "auth.uid != null",
".write": false
}
}
}
注册活动:
//Check if num already exist
binding.continueBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (binding.phoneNumBox.getText().toString().isEmpty()) {
binding.phoneNumBox.setError(getString(R.string.please_enter_phone));
} else if (binding.phoneNumBox.getText().toString().length() < 6) {
binding.phoneNumBox.setError(getString(R.string.enter_valid_phone));
} else {
DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Users");
userRef.orderByChild("phoneNumber")
.equalTo(binding.phoneNumBox.getText().toString())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Toast.makeText(RegPhoneNumActivity.this, getString(R.string.already_exist), Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(RegPhoneNumActivity.this, OTPActivity.class);
intent.putExtra("phoneNumber", binding.phoneNumBox.getText().toString());
startActivity(intent);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
登录活动:
//Check if num already exist
binding.loginContinueBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (binding.loginPhoneNumBox.getText().toString().isEmpty()) {
binding.loginPhoneNumBox.setError(getString(R.string.please_enter_phone_numb));
} else if (binding.loginPhoneNumBox.getText().toString().length() <= 6) {
binding.loginPhoneNumBox.setError(getString(R.string.plaese_enter_valid_phone_num));
} else {
userRef.orderByChild("phoneNumber")
.equalTo(binding.loginPhoneNumBox.getText().toString())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Intent intent = new Intent(PhoneLoginActivity.this, LoginVerifyPhoneActivity.class);
intent.putExtra("phoneNumber", binding.loginPhoneNumBox.getText().toString());
startActivity(intent);
} else {
Toast.makeText(PhoneLoginActivity.this, getString(R.string.phone_num_doesnt_exist), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
要允许用户仅读取他们自己的数据,您需要:
- 使用用户的 UID 作为他们节点的 key。
- 安全访问,如 content-owner only access 上的文档所示。
对于意味着您的 Users
节点变成这样的规则:
"Users": {
"$uid": {
".read": "$uid === auth.uid"
}
},
然后访问它的代码变为:
userRef.child(FirebaseAuth.getInstance().getCurrentUser().getUID())
.addListenerForSingleValueEvent(new ValueEventListener() {
虽然 也可以根据数据库中节点的值检查登录用户的 phone 号码,但用户也将拥有已经登录。如果是这种情况,请查看 securely querying data.
上的文档