gpt4 book ai didi

angular - 在 AngularFire 和 Angularjs 2 中编写路由守卫以等待身份验证

转载 作者:太空狗 更新时间:2023-10-29 18:17:08 25 4
gpt4 key购买 nike

我正在尝试在 Angular.js 2 (2.0.0-rc.4)(由 angular cli 创建)中编写一个路由器守卫,等待 AngularFire (2.0.0-beta.2) 检查登录状态和日志如果用户在允许进入状态之前已登录,则用户进入(匿名)。

我的守卫密码是:

canActivate() {
/* This part is to detect auth changes and log user in anonymously */
this.auth
.subscribe(auth => {
if (!auth) {
this.auth.login();
}
});

/* This part is to listen to auth changes and IF there is an auth, resolves this guard with a true to let user in */
return this.auth
.asObservable()
.filter(auth => {
return auth ? true : false;
})
.map(x => {
console.log("TEST 1000");
return true;
});
}

当我运行该应用程序时,即使我看到 TEST 1000 控制台输出表明 canActivate() 返回一个 true 我的路线不是激活。

请问是不是我的逻辑思维有问题,或者有什么好的思路可以智能调试。

最佳答案

我目前正在使用它来检查身份验证以及用户是否是管理员:

授权服务:

import { Injectable } from '@angular/core';

import { Router } from '@angular/router';

import { AngularFire } from 'angularfire2';


import { Observable } from 'rxjs/Observable';

import { Subject } from 'rxjs/Rx';


@Injectable()

export class AuthService {


  admin$: Subject<boolean>;


  private user: any = null;


  constructor(private af: AngularFire, private router: Router) {

    this.admin$ = <Subject<boolean>>new Subject();

    this.af.auth.subscribe(

      auth => {

        if(auth){

          this.user = af.database.object(`users_list/${auth.uid}`).subscribe(

            res => {

              this.user = res;

              this.admin$.next(this.user.role === 10);

              this.admin$.complete();

            },

            err => this.admin$.error(err)

          );

        }else{

          this.router.navigate(['auth']);

          this.admin$.next(false);

          this.admin$.complete();

        }

      }

    );

  }


  doLogin(credentials){

    this.admin$ = <Subject<boolean>>new Subject();

    this.af.auth.login(credentials);

  }


  admin() {

    return this.admin$;

  }

}

Auth Guard 服务:

constructor(private authService: AuthService, private router: Router) { }


  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {


    this.authService.admin().subscribe(

      res => {

        // Navigate to the login page

        if(!res) {

          this.router.navigate(['/auth']);

        }

      },

      err => console.log(err),

      () => {

        // console.log('auth guard can activate complete')

      }

    );


    return this.authService.admin();

  }

现在,这与您的问题的关系是,如果不在 admin$ 上调用 complete(),它将无法工作。控制台将记录 true 但路由器不会导航到下一个状态。

我几乎仍然掌握了可观察对象的窍门(因此实现不佳),如果你能修复你的代码,我真的很想看到最终结果,因为它看起来更清晰,而且可能更好方法来做到这一点。干杯!

关于angular - 在 AngularFire 和 Angularjs 2 中编写路由守卫以等待身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38554022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com