2017-03-03 4 views
1

내 앱 전체에서 언제든지 내 사용자의 역할을 알 수 있기를 원합니다. 그래서/user/$ uid/role 노드가 있습니다.firebase 사용자를 추가 또는 수정하십시오.

각기 다른 유형의 사용자를 앱의 여러 영역으로 연결하는 각도 경로 보호 기능을 설정하고 싶습니다. 다른 역할이 다른 역할에 액세스 할 수 없어야합니다. 프리랜서/고용주 사이트를 생각해보십시오. 프리랜서 만이 프리랜서를위한 경로에 액세스 할 수 있어야합니다.

사용자가 로그인하면 $ uid가 auth.subscribe의 사용자와 동일한 노드를 쿼리합니다. 나는 AuthInfo 인스턴스를 관찰하고있는 행동 주제를 설정하려고 시도했다. 누구든지 페이지를 새로 고침하고, firebase 인증 상태를 다시 쿼리하고, 쿼리를 실행하여 역할을 다시 확인합니다. 이것은 너무 느리며 라우터 가드는 사용자에게 아무런 역할이 없다고 생각하기 때문에 액세스를 차단합니다.

어떻게 앱 전체에서 사용자와 사용자의 역할을 지속하고 모니터링 할 수 있습니까? ngrx 또는 redux를 사용해야합니까? {$의 UID : UID, 역할 : GROUPA} 내가 angularfire2을 사용하고

나는 개체가

인증과 같을 것이다 상상한다.

답변

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]}, 
관련 문제