我希望能够在整个应用中随时了解用户的角色。所以我有一个/ user / $ uid / role节点。
我希望能够设置角度路线防护,以将不同类型的用户路由到应用的不同区域。不同的角色不应该能够访问另一个角色。想想自由职业/雇主网站。只有自由职业者应该能够访问自由职业者的路线。
我让它工作在用户登录的地方,我从auth.subscribe查询$ uid等于用户的节点。我已经尝试设置一个行为主题,我正在观察一个AuthInfo实例。无论我刷新页面,重新查询firebase身份验证状态,运行查询以再次检查角色。这太慢了,路由器防护会阻止访问,因为它认为用户没有角色。
如何在整个应用中坚持并监控用户及其角色?我需要使用ngrx还是redux?
我想象对象看起来像
Auth:{$ uid:uid,role:groupA}
我正在使用angularfire2。
答案 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]},