我有一个使用Firebase Auth实现的登录系统,但是每当我禁用任何用户时,他/她仍然可以被记录。
但是当他/她注销并单独登录他/她时,禁用系统就开始工作了。
那么,我应该做什么来检查每次检查,一个用户是否被禁用?有什么功能什么的吗?
谢谢。
发布于 2020-02-05 21:15:59
您可以通过FirebaseAuth.getInstance().getCurrentUser().reload();
或FirebaseUser.reload()
检查状态--代码手动刷新当前用户的数据(例如,附加提供程序、显示名称等)。
在Android中,如果第一个电子邮件帐户在Firebase身份验证仪表板中被禁用&在您的Android代码中,上面的.reload()被禁用,那么下一个FirebaseAuth.getInstance().getCurrentUser();
调用将返回一个null。
或
如果当前用户的帐户已被禁用、删除或其凭据不再有效,则引发FirebaseAuthInvalidUserException
发布于 2017-11-13 16:05:27
编辑:2022年4月20日
由于答案是旧的,我将添加另一种方法,即调用FirebaseUser#reload()方法,该方法:
手动刷新当前用户的数据(例如,附加提供程序、显示名称等)。
因此,当调用reload()
方法时,这意味着我们从Firebase服务器重新加载用户的配置文件数据。另外要提到的是,如果以下情况,将引发FirebaseAuthInvalidUserException:
当前用户的帐户已被禁用或删除,或其凭据不再有效。
但请记住,这也并不意味着状态发生了变化。您需要显式地调用此方法,例如,当用户打开应用程序时。还请记住,该方法是异步的,它返回一个Task对象。因此,您需要附加一个侦听器,以便从服务器获取新的配置文件数据。
如果您使用disable
或delete
,用户帐户并不意味着它也会触发auth state change
。也不应该这样做,因为用户仍然在应用程序中进行身份验证。您需要知道,在最多一个小时内,Firebase Authentication
将尝试刷新禁用或删除的特定用户的访问令牌。但是在这种情况下,刷新将失败,此时用户将没有身份验证。这是auth状态更改事件将触发的点。
如果您想立即撤销用户的授权,则必须在应用程序逻辑的另一部分中这样做。对于Firebase,常见的做法是在数据库中创建一个名为blacklist
的新节点,它应该如下所示:
Firebase-root
|
--- bannedUsers
|
uidOfBannedUser: true
现在,当删除/禁用Firebase控制台中的用户帐户时,还需要将相应的UID添加到数据库中的禁用用户列表中。
然后,可以在防火墙数据库安全规则的帮助下保护数据库免受未经授权的用户的访问。这可以通过在数据库安全规则中添加一个子句来完成,如下所示:
{
"rules": {
"bannedUsers": {
".read": true,
".write": false // only admins can write these
},
"messages": {
".read": "auth != null && !root.child('bannedUsers').child(auth.uid).exists()"
}
}
}
如果使用不同的后端,则实现将有所不同。可以有更多的例子,但是像这样的黑名单是禁止用户使用的一种常见方法。您会发现,您甚至可能对他们的身份验证不够关心,只禁止他们,而不是删除他们的凭据,他们可以简单地重新创建。
发布于 2020-11-23 06:26:05
将theFirebaseUser.reload()与onCompleteListener一起使用,如果此侦听器返回失败,则显示提示并将用户签出或移至登录页面
https://stackoverflow.com/questions/47239979
复制相似问题