Angular 6 - защита маршрута на основе значений узла пожарного депо - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я создаю Angular-проект с Firestore.У меня есть коллекция users, которая содержит имена пользователей uid, а также их имя, адрес электронной почты и название компании.После входа в систему я могу успешно извлечь пользовательский uid, найти документ в firestore, а затем перенаправить его на domain.com/theircompanyname - theircompanyname, что хранится в firestore в разделе коллекция пользователя> document.

Однако в настоящее время это не мешает кому-либо вводить название компании в 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 Это перенаправит пользователя на соответствующий URL-адрес, основанный на названии его компании в firestore (который я проверяю, передавая 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 голосов
/ 02 апреля 2019

Я думаю, что правильный путь - создать правила в вашей базе данных пожарного депо, чтобы она была безопасной.Я воспользовался правилами, проверил, владеет ли пользователь компанией, и предоставил права на чтение

...