角色2 AuthGuard Firebase认证

前端之家收集整理的这篇文章主要介绍了角色2 AuthGuard Firebase认证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用Firebase Auth构建一个角色2路由的AuthGuard.

这是AuthGuard服务:

  1. import { Injectable } from '@angular/core';
  2. import { CanActivate,Router,ActivatedRouteSnapshot,RouterStateSnapshot } from '@angular/router';
  3. import { AuthService } from './auth.service';
  4.  
  5. @Injectable()
  6. export class AuthGuard implements CanActivate {
  7.  
  8. constructor(private AuthService: AuthService,private router: Router) {}
  9.  
  10. canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) {
  11. if (this.AuthService.loggedIn) { return true; }
  12.  
  13. this.router.navigate(['login']);
  14. return false;
  15. }
  16. }

这是AuthService,它检查用户登录,并将结果绑定到其构造函数中的“loggedIn”属性.

  1. import { Injectable } from '@angular/core';
  2. import { AngularFire } from 'angularfire2';
  3. import { Router } from '@angular/router';
  4.  
  5. @Injectable()
  6. export class AuthService {
  7. loggedIn: boolean = false;
  8.  
  9. constructor(
  10. public af: AngularFire,public router: Router) {
  11. af.auth.subscribe(user => {
  12. if(user){
  13. this.loggedIn = true;
  14. }
  15. });
  16. }
  17. }

这里的问题显然是不同步的. AuthGuard的canActivate()总是返回一个false值,因为订阅没有及时收到数据,将“loggedIn”更改为true.

解决这个问题的最佳做法是什么?

编辑:

更改了AuthGuard返回一个可观察值.

  1. canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) {
  2. return this.af.auth.map((auth) => {
  3. if (!auth) {
  4. this.router.navigateByUrl('login');
  5. return false;
  6. }
  7. return true;
  8. });
  9. }

它的作品,因为你没有被重定向登录…但目标AuthGuarded组件没有渲染.

不知道是否与我的app.routes有关.这是该部分的代码

  1. const routes: Routes = [
  2. { path: '',component: MainComponent,canActivate: [AuthGuard] },...
  3. ];
  4.  
  5. export const routing = RouterModule.forRoot(routes);
使用.take(1)完成可观察的操作,使组件呈现.
  1. import {Observable} from "rxjs/Observable";
  2. import 'rxjs/add/operator/map';
  3. import 'rxjs/add/operator/take';
  4.  
  5. canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) {
  6. return this.af.auth.map((auth) => {
  7. if (!auth) {
  8. this.router.navigateByUrl('login');
  9. return false;
  10. }
  11. return true;
  12. }).take(1);
  13. }

猜你在找的Angularjs相关文章