如果我直接从Firebase控制台删除用户,则此用户在我的Android设备上仍然拥有有效数据。
当然,如果我然后访问不能按预期工作的firebase资源(例如实时数据库)。
但这会导致客户端错位,因为如果我有有效的用户数据,我会为经过身份验证的用户显示特定的UI,而如果我没有经过身份验证的用户,则会显示另一个用户界面。
我该如何处理这种情况?
编辑:我发现了什么,但如果可以,我现在就不行,或者解决方法是在我的FirebaseUser上调用reload()。
从文档中可以抛出和异常,但这并没有发生。会发生什么是我的用户引用变为空:
private void initializeUI(FirebaseUser user) {
user.reload();
if (null != user) {
mUser = user;
} else {
// User must have been disabled or deleted from console
}
我在这里调用initializeUI:
@Override
public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (null != user) {
initializeSignInUI(user);
} else {
initializeSignOutUI();
}
}
更多信息:
如果我打开我的应用程序,用户在客户端仍然活着。验证用户的触发器被触发,在这里,我的代码可以管理这种情况。但我不知道这实际上是一种解决方法还是正确的做法。
编辑2 只是重新提出我的问题:
这种方法运作良好:
public boolean validUser(FirebaseUser user) {
boolean validUser = false;
if (null != user) {
try {
user.reload();
if (null != user) {
validUser = true;
}
} catch (Exception e) {
//} catch (FirebaseAuthInvalidUserException e) {
validUser = false;
}
}
return validUser;
}
我可以考虑一个有效的解决方案还是另一种最佳做法?此解决方案仅适用于FirebaseAuth,无需与FirebaseDatabase进行交互。 我每次都可以调用此方法来检查用户身份验证。
答案 0 :(得分:3)
如果您的用户已在您的应用程序中登录,并且您正在手动将其从Firebase控制台中删除,则该用户将保持活动状态,直到该令牌将被刷新。因此,对于大约一个小时,用户将保持身份验证。因此,如果您想立即限制用户的访问权限,则需要签署他。
但还有另一种解决方法,您可以在Firebase数据库中创建名为usersToLogOut
的新节点,并将所有用户ID添加为keys
,将布尔true
添加为值。数据库应如下所示:
Firebase-root
|
--- usersToLogOut
|
--- uid1: true
|
--- uid2: true
下一步,当您手动检测该帐户时,需要在此节点下添加用户的uid。您还需要使用Firebase安全规则撤消对未授权用户的访问权限。规则应如下所示:
{
"rules": {
"usersToLogOut": {
".read": true,
".write": false
},
"posts": {
".read": "auth != null && !root.child('usersToLogOut').child(auth.uid).exists()"
}
}
}
<强> EDIT1:强>
根据您的编辑,您说:what I'm asking here is not how to secure my DB from him/her but I to check that It has been deleted
但是通过使用上述规则,您可以更轻松地实现此目的。如果从控制台手动删除用户,这并不意味着您要删除所有内容,包括数据库记录。你需要自己做这件事。所以最简单的方法就是使用规则。
此外,如果删除所有用户记录,则可以添加侦听器并强制他注销,但这意味着您需要在数据库中搜索所有记录并相应地删除它们。第一个解决方案更容易,因为您只需要在数据库中添加一条记录即可!
<强> EDIT2:强>
当您手动删除用户时,这并不意味着firebaseUser
对象将是null
,因此要检查无效,它没有任何意义,因为用户仍将进行身份验证,直到下一个令牌刷新。因此,要解决此问题,您需要使用Firebase规则来限制访问权限。
所以你的代码将始终有效。我想说的是,在您从控制台手动删除用户的时间和刷新令牌的时间之间,用户仍然可以访问您的应用程序的时间长达一个小时,即使他被删除了。要在此时间内停止此操作,您需要使用上述解决方案。
根据OP的评论编辑3:
您的代码运行良好并且始终有效但问题是,即使您从控制台删除用户,他仍然会加入数据库,直到下一个令牌刷新。是的,用户将能够访问数据库。该令牌将在大约一小时内有效,如果您不希望这样,您可以限制使用安全规则,并且在该小时内用户无法再访问。
换句话说,如果你也从客户端删除它,如果它无效,如果其他人“被盗”,这个令牌可以用它来访问数据库。不是使用您的应用程序的用户,而是可能盗用该令牌的用户。
答案 1 :(得分:2)
要检查用户是否已在数据库中删除,请尝试以下操作:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String useruid=user.getUid();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users").child(useruid);
ref.addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()){
//update UI
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
以上将检查useruid是否存在,并且由于您也从数据库中删除,因此将无法找到它,然后您可以使用setVisiblity()
更新UI
假设你在DB中有这个:
users
useruid
username: userx
email: userx@gmail.com
useruid
username: usery
email:usery@gmail.com