角度防护服务注入服务

问题描述 投票:0回答:2

我需要在守卫中注入服务。该守卫检查用户是否被邀请,如果是,他就可以访问该路线。

要检查此条件,我需要调用从数据库获取此信息的服务。

我有一个循环依赖错误,我知道我们不应该在 Guards 中注入服务,但在这种情况下,我需要这样做:

  providers: [AuthService, HackService, HacksStorageService, AuthGuard, EmailGuard],

守卫:

import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate } from "../../../node_modules/@angular/router";
import { HacksStorageService } from "../shared/hacks-storage.service";

export class EmailGuard implements CanActivate {

  constructor(
    private hacksStorageService: HacksStorageService,
  ) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    this.hacksStorageService.fetchHack();
    // check if user was invited. should be in the participants array
    return true;
  }
}

我很困惑。通常我使用守卫来查看用户是否登录,所以我通常从 firebase 导入东西,而不是从我自己的服务导入,所以不是循环依赖。

现在我想根据我自己的数据检查是否发生了某种情况。如果由于循环依赖而不允许我注入服务,我如何在 EmailGuard 中注入自己的数据?

谢谢。

angular service guard
2个回答
4
投票

您可以在守卫中注入服务。 如果您的服务同步返回,那么您可以立即返回,就像示例代码中一样。 否则,我是这样做的(使用 firebase auth)

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable, of } from 'rxjs';
import { map, first } from 'rxjs/operators';
import { AngularFireAuth } from '@angular/fire/auth';
import { Paths } from './paths';

@Injectable({
  providedIn: 'root'
})
export class SignInGuard implements CanActivate {

  constructor(private afAuth: AngularFireAuth, private router: Router) { }

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
      return this.afAuth.user.pipe(
        first(),
        map(user => {
          if (user) {
            this.router.navigate([Paths.MAIN_PATH]);
            return false;
          } else {
            return true;
          }
        })
      );
  }
}

0
投票

当前的解决方案可以在这里找到:

const canActivateTeam: CanActivateFn = 
  (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
    return inject(PermissionsService).canActivate(inject(UserToken), route.params.id);
  };
© www.soinside.com 2019 - 2024. All rights reserved.