我想要这样的事情:
true
根据我在Firebase控制台中制定的安全规则,这应该返回false
或{{1}}。
答案 0 :(得分:1)
首先,您需要使用custom claims and security rules限制对实时数据库的访问(因为默认情况下,您限制或允许所有用户的读/写权限。)
然后,在客户端上,通过解析id令牌并检查自定义声明来检查给定用户是否有权访问数据库(请参阅“访问客户端上的自定义声明”部分中的示例从上面的链接。示例是用JS编写的,但是将它转换为例如Swift应该没有问题。此外,您可以轻松地在canWrite()
对象的FIRUser
扩展中包装此功能(检查有效声明),该扩展返回true或false,具体取决于令牌是否具有正确的声明。
答案 1 :(得分:0)
好的,我完成了建议,在分析了所有内容之后,我找到了一个很好的解决方法。现在让我首先告诉你,我想限制管理员以外的用户查看“添加新项目”,“删除项目”等UI按钮,以便他们无法修改数据库。
例如,我只希望拥有凭据admin@admin.com的用户可以访问允许在数据库中进行修改的按钮和页面。
聚苯乙烯。这是一个离子项目。
在我的 app.component.ts 文件中:
import { Events } from 'ionic-angular';
export class MyApp{
admins: any;
constructor(public events: Events){
this.initializeApp();
this.admins =[
{email: 'admin@admin.com'},
{email: 'another_admin@admin.com'}
//You may add more users whom you want to give admin privilege..
];
// Now subscribe to an event to check if the logged-in user is an admin user or not!
events.subscribe('check:admin', (email) => {
var isAdmin = false;
this.admins.forEach((x) => {
if(email === x.email)
isAdmin = true;
});
return isAdmin;
});
}
}
在我的 home.ts 文件中:这可以是项目中的任何页面,不一定是主页。
import { Events } from 'ionic-angular';
export class HomePage{
// Now declare and initialize a boolean variable. This will be true if the logged-in (currentUser) user is an admin.
isAdmin = this.events.publish('check:admin', firebase.auth().currentUser.email)[0];
// this.events.publish() returns an array, hence the weird workaround of '[0]'.
constructor(private events: Events){}
}
现在在我的 home.html 页面中:
<button *ngIf="isAdmin">Add new Item</button>
此处,“添加新项目”按钮仅显示变量“isAdmin”是否为真。这样,我们就可以控制哪些UI元素显示给哪种类型的用户..
希望这会有所帮助。谢谢!
答案 2 :(得分:0)
检查用户是否有权访问数据库的一种可能方法是尝试从数据库读取(或写入)任何值。
例如,我有一个“虚拟”节点,我尝试读取该值。如果操作失败,则表示我正在处理权限问题:
dummyNode.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// read access successfully tested.
}
@Override
public void onCancelled(DatabaseError firebaseError) {
Log.v(TAG,"firebaseError:"+firebaseError);
//Common Error here: Transaction at /F failed: DatabaseError: Permission denied
}
});