我使用firebase.auth()。signInWithEmailAndPassword创建了一些用户,并希望立即停止signUp,但保持signIn工作。我尝试了一些关于用户的规则,甚至根本不再写入firebase。但是仍然可以进行注册。在控制台中禁用电子邮件/密码也会禁用登录。
{
"rules": {
".read": true,
".write": false,
}
}
如何在Firebase 3中向用户应用安全规则?
答案 0 :(得分:29)
Firebase明确将身份验证(登录到应用)与授权分开(从应用访问数据库或存储资源)。
如果不禁用所有用户的登录功能,则无法禁用注册,这不是您想要的。
在典型情况下,开发人员将根据经过身份验证的用户开始保护数据库/文件访问。请参阅database security和storage security的文档中的相关部分。
如果您的用例是您只希望特定用户拥有访问权限,那么您可能希望实施白名单:允许访问数据的用户列表。
您可以在安全规则中执行此操作:
"angular-resource": "^1.4.0",
或者(更好)将允许的uid列表放在数据库中并引用安全规则中的那个:
{
"rules": {
".read": "auth.uid == '123abc' || auth.uid == 'def456'",
".write": false,
}
}
然后:
"allowedUids": {
"123abc": true,
"def456": true
}
答案 1 :(得分:6)
问了问题已经有好几天了,但是也许这对那些仍想知道答案的人有所帮助,我们仍然不能简单地禁用新帐户的创建,但是我们可以使用Firebase函数:
这是使用云功能自动禁用新用户的解决方法。
const admin = require("firebase-admin");
exports.blockSignup = functions.auth.user().onCreate(event => {
return admin.auth().updateUser(event.uid, { disabled: true })
.then(userRecord => console.log( "Auto blocked user", userRecord.toJSON() ))
.catch(error => console.log( "Error auto blocking:", error ));
});
请记住,当您使用Firebase Web控制台或第三方创建用户时,会触发此功能。 因此,您必须创建,等待功能,然后启用用户。
答案 2 :(得分:1)
如果您要从Android应用程序中的FirebaseUI
删除注册选项,则必须添加以下提供程序:
new AuthUI.IdpConfig.EmailBuilder().setAllowNewAccounts(false).build());
,该函数将如下所示:
private void FireBaseLoginUI() {
List<AuthUI.IdpConfig> providers = Arrays.asList(
new AuthUI.IdpConfig.EmailBuilder().build(),
new AuthUI.IdpConfig.EmailBuilder().setAllowNewAccounts(false).build());
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.setLogo(R.drawable.app_logo)
.setTheme(R.style.AuthUITheme)
.build(),
RC_SIGN_IN);
}
答案 3 :(得分:0)
如上所述,区分身份验证和授权很重要。因此,这也可以稍微脱离Firebase来完成。例如,如果您正在构建Web应用程序,并且希望允许特定用户列表访问给定页面,则可以在Web应用程序中进行处理。
此示例用于执行onCall Firebase函数。仅在用户UID为12345
exports.ILoveConsole = functions.https.onCall((message, context) => {
//message is just a text
//context hold the user auth information
'use strict';
if (context && context.auth && context.auth.uid) {
if(context.auth.uid === "12345"){
console.log("I love security");
}
else{
console.log("You are authenticated but not authorized");
}
}
else {
console.log("You are neither authenticated nor authorized");
}
});
注意:如果要列出用户列表,则可以执行for循环功能以在浏览器中检查授权用户的阵列或调用firebase函数。它们都应该在加载页面之前运行
答案 4 :(得分:0)
我使用这个:
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();
exports.blockSignup = functions.auth.user().onCreate(event => {
if (process.env['allowCreation'] === "false")
return admin.auth().deleteUser(event.uid);
else return Promise.resolve("letUserCreate");
});
创建所需的用户后,转到https://console.cloud.google.com/functions并将环境变量更改为false,重新部署完成。
或者,您可以将用户添加到Firestore中,并且仅当该用户位于Firestore上时才允许注册。像这样:
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();
exports.blockSignup = functions.auth.user().onCreate(user => {
return new Promise((resolve, reject) => {
admin.firestore().collection('users').doc(user.email).get().then(doc => {
if (doc.exists) {
resolve("letUserCreate");
}
else {
reject(admin.auth().deleteUser(user.uid))
}
}).catch(reason => {
console.error(reason)
reject(admin.auth().deleteUser(user.uid))
})
});
});