В настоящее время я создаю 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;
}
}
}