- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
AngularFire2 似乎以不同于纯 firebase sdk 的方式处理权限。
重现此问题的步骤:
return this.afStore.doc('users/' + authId).valueChanges()
.pipe(map(u => {
if (u) {
return new User(u);
}
return null;
})
);
Missing or insufficient permissions
错误如果我将 firebase 的代码直接添加到我的 index.html
文件中,它仍然可以工作:
var email = "xxx@xxx.com";
var password = "xxx";
var firebaseConfig = {...};
firebase.initializeApp(firebaseConfig);
firebase.auth().onAuthStateChanged((u) => {
if (u) {
firebase.firestore().doc('users/' + u.uid).get()
.then(u => console.log("Got favorites", u.data()));
firebase.firestore().doc('favorites/' + u.uid).get()
.then(u => console.log("Got favorites", u.data()));
}
});
firebase.auth().signInWithEmailAndPassword(email, password).then(cred => {
console.log("Signed in", cred)
})
我的 firebase 规则如下,但它们在模拟器中似乎没问题,而且显然有时在前端工作:
service cloud.firestore {
match /databases/{database}/documents {
function internalGetUserFromReq() {
return get(/databases/$(database)/documents/users/$(request.auth.uid))
}
//...
match /users/{userID} {
allow read, write: if internalGetUserFromReq().data.authId == userID;
allow read, write: if internalGetUserFromReq().data.role == 0;
}
}
完整实现
为了更完整的图片,这是我的登录方法:
this.afAuth.auth.signInWithEmailAndPassword(email, password).then((cred: firebase.auth.UserCredential) => {
return this.user$;
}).catch((err: Error) => {
this.logout();
throw new Error(err.message);
});
我这样退出:
return this.afAuth.auth.signOut().then(() => {
this.appState.clean();
return this.router.navigate(['']);
});
我正在像这样收听 Firebase AuthState:
this.user$ = this.afAuth.authState.pipe(switchMap((user: firebase.User) => {
if (user) {
return this.getUser().pipe(catchError((err: Error) => {
this.logout();
return throwError(err);
}));
}
return of(null);
})).pipe(share());
switchMap 中引用的 getUser()
方法是我在问题顶部粘贴的原始方法,仅返回属于该用户的文档的可观察对象(例如 users/12345
).
回顾
回顾一下这个问题,登录/注销和 AuthState 观察器都按预期运行,但我在将 firebase 规则添加到我的 Firestore 文档时会限制用户只能访问他们自己的文档(即 authID
与 request.auth.uid
) 匹配,则文档将无法访问。此行为仅通过 AngularFire2 包发生,并且在页面重新加载后仍然存在,甚至在具有干净 cookie 和缓存的全新浏览器中打开应用程序时仍然存在。
解决方法
对于遇到此问题的任何其他人,我不得不删除 AngularFire2
(这同样适用于新的 @angular/fire
包)并将其替换为我自己的核心 firebase
包的包装器。
繁殖
我目前无法创建复制品 - 我知道这很烦人,当我有更多时间时我会尝试做一个。然而,这个问题在 AngularFire2 中根深蒂固,我将不得不创建一个新的 Angular 应用程序,设置一个新的 Firebase 实例,完成身份验证、Firestore 数据库和文档访问规则,然后还实现完整的用户登录过程。为了公正地对待这个问题,我还需要再次设置相同但没有 AngularFire2,只是为了证明是那个包导致了问题。在我难得的休息日里塞满工作对我来说太多了!
如果有人有时间修补并想设置一个,请给我留言,我很乐意提供帮助。
最佳答案
当你登录时,你得到了 firebase auth 用户,你获取它的 Id,然后你从数据库订阅用户文档,可能你正在使用 2 订阅,一个是 auth,第二个是用户完整文档(我们在这里看不到完整的身份验证代码),现在当您注销时,您的用户文档订阅仍在运行,但您现在没有权限获取用户完整文档,因为您不再登录(和规则是关于 auth 用户的),我的解决方案是将 switchMap 与 angularFire auth 一起使用,因此只有一个订阅(这实际上是您在后面的代码中所做的 - 仅在 html 中)
** 您的错误可能是因为注销而不是新登录
private _sub: Subscription;
constructor(private _auth: AngularFireAuth, private _db: AngularFirestore){
this._sub = this._auth.authState
.pipe(
switchMap(u => (u)
? this._db.collection('Users).doc(u.uid)
.valueChanges()
: of(null))
.subscribe(user => {
// some actions
});
}
现在,当您注销时,firebase 将不会尝试再次获取用户文档并出现此错误
关于Angularfire2 显示 "Missing permissions"错误,而直接运行 firebase 没有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56728210/
$destroy() 存在于 Angularfire 中的原因是什么? angularfire 的文档说: https://www.firebase.com/docs/web/libraries/an
我收到“错误:permission_denied:客户端无权访问所需数据。”我比较确定我有规则问题。有没有办法跟踪 angularfire 中哪些客户端调用失败?该库中的抽象级别和异步性使得甚至很难找
我看过有关如何检查特定文档是否存在的示例。但是,是否可以在执行如下查询时检查文档是否存在? private albumsCollection: AngularFirestoreCollection;
我正在寻找一种方法来获取子元素的方法,而不是单独加载该元素。 假设我有一个 Post 模型,每个帖子都有评论。这就是我获得帖子模型的方式: var post = $firebase(new Fireb
这是我认为的相关代码: p(ng-repeat="t in todos") input( type="checkbox", ng-model="t.done", ng-clic
好的,我刚开始使用 Firebase。我读过这个:https://www.firebase.com/docs/data-structure.html我读过这个:https://www.firebase
如何更新节点内的单个对象。 { foo: { title: 'hello world', time: '1000' } } 如上所述,我只想更新标题。$firebase(new
我正在使用 AngularFire并在我的 app.module.ts 中启用离线支持的持久性: imports: [ AngularFireModule.initializeApp(envir
我无法增加帖子“点赞”的数量。以下是我现在拥有的: addLike(pid, uid) { const data = { uid: uid, }; this.afs
我正在使用 AngularFire 创建一个新用户。但是,当我注册用户时,我还会询问名字和姓氏,并在注册后添加该信息。 $firebaseSimpleLogin(fbRef).$createUser(
我已经在 DIV 中发布了有关我的背景图像的先例问题。它在当前日期成功运行。但是,当我想使用用户在数据库中输入的时间和模型“starthourid”来调整背景图像时,它不起作用(它显示“夜晚”)!但数
在努力完成Angular tutorials on their website时当我尝试创建一个使用 Firebase 的列表时,我陷入了困境。来存储数据。奇怪的是,Angular 网站上一切正常,但
我正在努力使用 AngularFire 进行用户身份验证和授权。 问题是,一旦授权用户登录并显示来自 Firebase 的数据,如果我注销,则数据仍然会显示。我可以将数据从范围中分离出来(delete
我正在使用 AngularFire 和 Angular 8 来构建一个应用程序,但我有一个愚蠢的问题(我相信它实际上很愚蠢)。 我构建了一个简单的服务来包装 AngularFireAuth : imp
我正在使用 Angularfire 制作网站。我正在尝试将基于 oauth 的登录与 google 集成以进行用户身份验证,但是当我尝试运行 index.html 文件并尝试登录时显示错误 11:59
我想让我的 angularFire 集合在路由加载时解析。像这样的东西: App.config ($routeProvider, angularFireProvider) -> $routePro
我正在尝试获取简单 angularFireCollection 数组的长度,但似乎无法: var stf = new FireBase("http://myfirebase-app.firebasei
我有一个带有用户存储的 FireBase 数据库。我也使用简单的登录电子邮件/密码。在用户存储中,我保存了一些用户的额外信息——例如最后登录日期。这是我的工作流程 - 从注册到登录: 我注册了一个用户
我在 /items 中有 Firebase 条目,其属性为 title 和 points。在输入新项目之前,我试图检查是否存在具有相同 title 的项目。 这是我所拥有的,但它并没有发生: app.
我将数据按以下结构存储在 firebase 中(图 1)。我遵循了结构化数据的指南,并将其保存在一个平面结构中,其中包含事件和用户的键值对,以允许多对多关系引用。我想使用 userid 来查找用户有权
我是一名优秀的程序员,十分优秀!