2017-03-03 38 views
1

我希望能夠在我的應用程序的任何時候瞭解我的用戶的角色。所以我有一個/用戶/ $ uid /角色節點。添加或修改可見的Firebase用戶

我希望能夠設置角度路由衛兵,將不同類型的用戶路由到應用的不同區域。不同的角色不應該能夠訪問其他角色。想想一個自由職業者/僱主網站。只有自由職業者才能訪問自由職業者的路線。

我有它的工作,一旦用戶登錄,我查詢$ uid等於用戶從auth.subscribe的節點。我試着在觀察AuthInfo實例的地方設置行爲主題。無論我刷新頁面,重新查詢Firebase身份驗證狀態,都會運行查詢以再次檢查角色。這太慢了,因爲它認爲用戶沒有角色,所以路由器防護裝置阻止訪問。

如何在整個應用程序中堅持並監視用戶及其角色?我需要使用ngrx還是redux?

我想象中的物體看起來像

驗證:{$ UID:UID,作用:A組}

我使用angularfire2。

回答

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]}, 
相關問題