首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当尝试保存到数据库时,Angularfire firestore一直没有提供足够的权限

当尝试保存到数据库时,Angularfire firestore一直没有提供足够的权限
EN

Stack Overflow用户
提问于 2021-05-29 22:52:49
回答 2查看 121关注 0票数 3

当我尝试上传到云firestore时,我一直收到"FirebaseError:缺少或权限不足“的提示

这些是我的规则

代码语言:javascript
复制
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
   match /{document=**} {
      allow read: if request.auth.uid == request.auth.uid
      allow write:  if request.auth.uid == request.auth.uid
    }
  }
}

这是我的服务

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { User } from '../Models/Users';
import { AlertController } from '@ionic/angular';
import { AngularFireAuth } from '@angular/fire/auth';
import * as firebase from 'firebase/app';
import { AngularFirestore } from '@angular/fire/firestore';
import { first } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})

export class FirebaseService {

  constructor(
    private auth : AngularFireAuth,
    private firestore : AngularFirestore,
    private altCtrl : AlertController
  ) { }



  isLoggedIn() {
    return this.auth.authState.pipe(first()).toPromise();
  }
  async login(email:string, password:string):Promise<any>{
    var result = await this.auth.signInWithEmailAndPassword(email, password);

    //var result = await firebase.auth().signInWithEmailAndPassword(email,password);
    if(result.user !== undefined ){
      var uid = result.user.uid;
      return uid;
    }else{
      return null;
    }
  }

  async createAccount(email:string,password:string, user:User):Promise<boolean>{
    try {
      var result = await this.auth.createUserWithEmailAndPassword(email,password);
      //var result = await firebase.auth().createUserWithEmailAndPassword(email,password);
      if(result.user != undefined){
        return true;
      }else{
        return false;
      }
    } catch (error) {
      throw error;
    }
  }


  async createUserDocument(user:User):Promise<boolean>{
    try {
      await this.login(user.email, user.password);
      var result = await this.isLoggedIn();
      if(result){
        await this.firestore.collection('Users').doc(user.first_name).set(user);
        //await firebase.firestore().collection("Users").add(user);
        return true;
      }else{
        return false;
      }


    } catch (error) {
      throw error;
      return false;
    }
  }


}

这是我的应用程序模块

代码语言:javascript
复制
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { LoaderComponent } from './widgets/loader/loader.component';
import { SQLite } from '@ionic-native/sqlite/ngx';
import { IonicStorageModule } from '@ionic/storage-angular';
import { AuthGuard } from './Guards/auth.guard';
import { AutoLoginGuard } from './Guards/auto-login.guard';
import { AngularFireModule } from '@angular/fire';
import {  AngularFirestoreModule } from '@angular/fire/firestore';

import { FirebaseService } from '../app/Services/firebase.service';

//real information hidden for security
const config = {
  apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  authDomain: "xxxxxxxxxxxxxxxxxxxxxxxxx",
  projectId: "xxxxxxxxxxxxxxxxxxxxxxxxx",
  storageBucket: "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  messagingSenderId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
  appId: "xxxxxxxxxxxxxxxxxxxxxx",
  measurementId: "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
@NgModule({
  declarations: [
    AppComponent,
    LoaderComponent
  ],
  entryComponents: [],
  imports: [
    BrowserModule,
    IonicModule.forRoot(),
    AppRoutingModule,
    IonicStorageModule.forRoot(),
    AngularFireModule.initializeApp(config),
    AngularFirestoreModule,
    AngularFirestoreModule.enablePersistence(),
  ],
  providers: [
    {
      provide: RouteReuseStrategy,
      useClass: IonicRouteStrategy
    },
    AuthGuard,
    AutoLoginGuard,
    SQLite,
    SplashScreen,

    FirebaseService,

  ],
  bootstrap: [AppComponent],
})
export class AppModule {}

仅当规则设置为if true时,保存到数据库才起作用。

在我的事业中,只要用户已经通过身份验证,就允许他们修改数据

EN

回答 2

Stack Overflow用户

发布于 2021-06-14 04:46:16

我不知道它是来自Angular 12还是firebase。我通过将firebase降级到8.3.0版本解决了这个问题

https://github.com/angular/angularfire/issues/2857

票数 2
EN

Stack Overflow用户

发布于 2021-06-15 03:44:50

好吧,我找到了某种解决方案。但是我真的不能解释为什么它是有效的。

解决方案:首先,我将private afAuth: AngularFireAuth添加到一个随机组件的构造函数中。在那之后它还是不能工作了。但是,如果我在随机组件中的任何地方添加this.afAuth.setPersistence(firebase.auth.Auth.Persistence.SESSION);this.afAuth.signInWithPopup(new firebase.auth.GoogleAuthProvider()); (即使这些行从未被调用过),AuthService会突然工作并输出我想要的所有数据。

详情:https://github.com/angular/angularfire/issues/2864

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67752726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档