角色2 AuthGuard Firebase认证
发布时间:2020-12-17 07:36:55 所属栏目:安全 来源:网络整理
导读:我试图使用Firebase Auth构建一个角色2路由的AuthGuard. 这是AuthGuard服务: import { Injectable } from '@angular/core';import { CanActivate,Router,ActivatedRouteSnapshot,RouterStateSnapshot } from '@angular/router';import { AuthService } from
我试图使用Firebase Auth构建一个角色2路由的AuthGuard.
这是AuthGuard服务: import { Injectable } from '@angular/core'; import { CanActivate,Router,ActivatedRouteSnapshot,RouterStateSnapshot } from '@angular/router'; import { AuthService } from './auth.service'; @Injectable() export class AuthGuard implements CanActivate { constructor(private AuthService: AuthService,private router: Router) {} canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) { if (this.AuthService.loggedIn) { return true; } this.router.navigate(['login']); return false; } } 这是AuthService,它检查用户的登录,并将结果绑定到其构造函数中的“loggedIn”属性. import { Injectable } from '@angular/core'; import { AngularFire } from 'angularfire2'; import { Router } from '@angular/router'; @Injectable() export class AuthService { loggedIn: boolean = false; constructor( public af: AngularFire,public router: Router) { af.auth.subscribe(user => { if(user){ this.loggedIn = true; } }); } } 这里的问题显然是不同步的. AuthGuard的canActivate()总是返回一个false值,因为订阅没有及时收到数据,将“loggedIn”更改为true. 解决这个问题的最佳做法是什么? 编辑: 更改了AuthGuard返回一个可观察值. canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) { return this.af.auth.map((auth) => { if (!auth) { this.router.navigateByUrl('login'); return false; } return true; }); } 它的作品,因为你没有被重定向到登录…但目标AuthGuarded组件没有渲染. 不知道是否与我的app.routes有关.这是该部分的代码: const routes: Routes = [ { path: '',component: MainComponent,canActivate: [AuthGuard] },... ]; export const routing = RouterModule.forRoot(routes);
使用.take(1)完成可观察的操作,使组件呈现.
import {Observable} from "rxjs/Observable"; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/take'; canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) { return this.af.auth.map((auth) => { if (!auth) { this.router.navigateByUrl('login'); return false; } return true; }).take(1); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 使用JSONP找不到JSON_CALLBACK
- 1.3、Bootstrap V4自学之路------起步---浏览器支持
- 什么是Scala的shebang系列,它不会破坏mimetype?
- angularjs – Ui-sref不在URL中生成哈希值(Angular 1.3.0-r
- BootStrap入门教程 (一)
- 【数据结构】线索化二叉树中序线索化的递归写法和非递归写法
- 语法 – onoremap vim c-u的目的
- angularjs – simpleLoginTool给我“错误:当我尝试注册新用
- Angularjs切换图像onclick
- 4.8Bootstrap学习js插件篇之按钮