2017-03-03 5 views
1

私はいつでも自分のユーザーの役割を知ることができます。だから私は/ user/$ uid/roleノードを持っています。firebaseユーザーを追加または変更することができます

さまざまなタイプのユーザーをアプリのさまざまな領域に誘導するために、角度経路ガードを設定できます。異なる役割が他の役割にアクセスできなくてはなりません。フリーランス/雇用者のサイトを考えてみましょう。フリーランサーのみがフリーランサーのルートにアクセスできるはずです。

ユーザーがログインすると、$ uidがauth.subscribeのユーザーと等しいノードに問い合わせます。私は、AuthInfoインスタンスを観察している動作対象を設定しようとしました。誰でもページをリフレッシュし、firebase認証状態を再クエリーし、クエリーを実行してロールを再度チェックします。これは遅すぎるため、ルーターガードはユーザーには何の役割もないと考えてアクセスを阻止します。

どのようにアプリケーション全体でユーザーとその役割を維持し、監視できますか? ngrxまたはreduxを使用する必要がありますか? {$のUID:UID、役割:グループA}私はangularfire2を使用してい

は、私は、オブジェクトが

Authのようになります想像してみてください。

答えて

0

あなただけの役割のauthguardsを持っている必要があり、その後、例えばルータ

にcanActivate配列に渡します。私は私のアプリで管理者とジャッジの役割を持っています。だから私は、裁判官ガードを持っている:

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]}, 
関連する問題