添加或修改firebase用户可观察

时间:2017-03-03 05:01:21

标签: firebase firebase-authentication angularfire2

我希望能够在整个应用中随时了解用户的角色。所以我有一个/ user / $ uid / role节点。

我希望能够设置角度路线防护,以将不同类型的用户路由到应用的不同区域。不同的角色不应该能够访问另一个角​​色。想想自由职业/雇主网站。只有自由职业者应该能够访问自由职业者的路线。

我让它工作在用户登录的地方,我从auth.subscribe查询$ uid等于用户的节点。我已经尝试设置一个行为主题,我正在观察一个AuthInfo实例。无论我刷新页面,重新查询firebase身份验证状态,运行查询以再次检查角色。这太慢了,路由器防护会阻止访问,因为它认为用户没有角色。

如何在整个应用中坚持并监控用户及其角色?我需要使用ngrx还是redux?

我想象对象看起来像

Auth:{$ uid:uid,role:groupA}

我正在使用angularfire2。

1 个答案:

答案 0 :(得分:0)

你只需要为角色设置authguards,然后在路由器的canActivate数组中传递它们

例如,

。我的应用程序中有Admin和Judge角色。所以我有法官:

import { Injectable } from '@angular/core';
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthService} from './auth.service';
import {tap, map, take} from 'rxjs/operators';

@Injectable()
export class JudgeGuard implements CanActivate {

  constructor(private auth: AuthService, public router: Router) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.auth.user.pipe(
      take(1),
      map(user => !!(user && user.roles.judge)), // if user exists and has role -> true nor false
      tap(isJudge => {
        if (!isJudge) {
          console.log('Acces denied - Judges Only');
          this.router.navigate(['/']);
        }
      })
    );
  }
}

然后在路由器模块中,

const routes: Routes = [
 ...
  {path: 'judge-dashboard', component: JudgeDashboardComponent, canActivate: [AuthGuard, JudgeGuard]},