我需要两个firebase项目为单个Android应用程序。一个项目是为用户,另一个是为管理员。由于某些原因,我正在使用管理员的firebase项目。
现在我需要连接这两个项目在管理应用程序,我想添加或修改firebase数据在两个firebase项目从管理应用程序的时间。
如何在Android中获得两个firebase项目的实例?
我已经看到一些关于这个的stackoverflow问题,但是他们没有同时得到两个实例。
有人能回答我的问题吗?
不要改变你的默认应用程序。正常连接你的应用程序到主firebase项目。此外,将应用程序注册到第二个firebase项目。现在,不要将google-services.json
文件直接导入到android项目中,而是像下面这样创建一个Singleton类,并将其替换为第二个firebase项目详细信息。
public class MySecondaryProject {
private static FirebaseApp INSTANCE;
public static FirebaseApp getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = getSecondProject(context);
}
return INSTANCE;
}
private static FirebaseApp getSecondProject(Context context) {
FirebaseOptions options1 = new FirebaseOptions.Builder()
.setApiKey("AI...gs")
.setApplicationId("1:5...46")
.setProjectId("my-project-id")
// setDatabaseURL(...) // in case you need firebase Realtime database
// setStorageBucket(...) // in case you need firebase storage MySecondaryProject
.build();
FirebaseApp.initializeApp(context, options1, "admin");
return FirebaseApp.getInstance("admin");
}
}
现在,当你需要第二个项目实例时,你可以像下面这样使用:
FirebaseFirestore db = FirebaseFirestore.getInstance(); //- DEFAULT PROJECT
FirebaseFirestore secondDB = FirebaseFirestore.getInstance(MySecondaryProject.getInstance(this)); // - SECOND PROJECT
你必须遵循单例模式来避免重复的实例,否则应用程序会崩溃。您可以同时使用这两个实例。
有关更多详细信息,请访问一些有用的链接
- 官方文档
- 一些Stackoverflow问题
- 其他来源形式:itone.com.vn
我想这将是你问题的完美答案。
简短的回答:不要。
您希望在单个项目上具有基于角色的访问控制,而不是管理员一个项目,用户一个项目。例如,管理员可以删除文件,而用户不能。
Firebase文档中提供了基于角色的访问的完整指南,以及一些变体。你的规则可能看起来像这样:
service cloud.firestore {
match /databases/{database}/documents {
match /stories/{story} {
function isSignedIn() {
return request.auth != null;
}
function getRole(rsc) {
// Read from the "roles" map in the resource (rsc).
return rsc.data.roles[request.auth.uid];
}
function isOneOfRoles(rsc, array) {
// Determine if the user is one of an array of roles
return isSignedIn() && (getRole(rsc) in array);
}
function isValidNewStory() {
// Valid if story does not exist and the new story has the correct owner.
return resource == null && isOneOfRoles(request.resource, ['owner']);
}
// Owners can read, write, and delete stories
allow write: if isValidNewStory() || isOneOfRoles(resource, ['owner']);
match /comments/{comment} {
// ...
}
}
}
}
如果您只有标准用户和管理员,则只需使用自定义声明。不要将角色写入Firestore。
它将使设置更容易,并且不会在规则中花费昂贵的get
调用。