角度警卫队服务注入服务

时间:2018-07-15 10:54:32

标签: angular service guard

我需要向警卫队注入服务。该警卫会检查是否邀请了该用户,如果是,则可以访问该路由。

要检查这种情况,我需要调用一个从数据库获取此信息的服务。

我有一个周期性的依赖错误,我知道我们不应该在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中注入自己的数据?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在守卫中注入服务。 如果您的服务同步返回,那么您可以像示例代码中那样立即返回。 否则,我是这样做的(使用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;
          }
        })
      );
  }
}

答案 1 :(得分:0)

尝试这样的事情。

在routing.module.ts中:

import { EmailGuard } from 'path_to_email_guard/email.guard';


const routes: Routes = [

    {
        path: 'path_to_email', component: EmailAccessComponent, canActivate: [EmailGuard]
}

在email.guard.ts中:

constructor(private hacksStorageService: HacksStorageService){
  }
        canActivate(next: ActivatedRouteSnapshot,
            state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

            return this.isValidate();
        }

isValidate() {
//write your verification logic in hasAccess Method.
        if (this.hacksStorageService.hasAccess()) {
            return true;
        } else {
            console.log("dont have access")
            return false;
        }

    }