Angular 6-基于Firestore节点值的Route Guard

时间:2019-04-02 08:51:12

标签: angular google-cloud-firestore angular-route-guards

我目前正在用Firestore构建Angular项目。我有一个users集合,其中包含一个用户uid以及他们的姓名,电子邮件和公司名称。登录后,我可以成功获取用户uid,在firestore中查找文档,然后将其重定向到domain.com/theircompanyname-theircompanyname是存储在firestore中用户集合>文档下的内容。

但是,目前,这并不能阻止任何人在url中输入公司名称并成功导航到该网址。我该如何实施仅向拥有与url中可见公司相匹配的公司的用户授予访问权限的路由保护?

login.ts

login(email: string, password:string) {
  this.afAuth.auth.signInWithEmailAndPassword(email, password).then(value => {
      const user_id = value.user.uid;
      this.userService.checkUserForCorrectRedirect(user_id)
  });
}

user.service.ts 这将根据用户在Firestore中的公司名称将用户重定向到适当的URL(我通过将登录名中的user_id传递给此函数来进行检查)

checkUserForCorrectRedirect(user_id: string) {
   var docRef = this.db.collection("users").doc(`${user_id}`);

   docRef.get().then((doc) => {
    if (doc.exists) {
        const data = doc.data();
        this.company = data.company;
        this.router.navigate(['e', data.company]);
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
 }).catch((error) => {
    console.log("Error getting document:", error);
 });
}

以上所有作品。可能的话,我需要路线防护。

router.guard 显然这是行不通的,而且我真的不知道该如何做。

 import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate, Router } from '@angular/router';
import { UserService } from '../services/user.service';

@Injectable()

export class AuthGuardService implements CanActivate {

    authGuardStateURL: string;

    constructor(
        private router: Router,
        private userService: UserService,
    ) { }



    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
        if (this.userService.company == "testcompany") {
            return true;
        } else {
            return false;
        }
    }

    }

1 个答案:

答案 0 :(得分:0)

我认为正确的做法是在Firestore数据库中创建规则,以确保安全。我确实使用规则进行挖掘,检查用户是否拥有公司,并授予读取权限