3

AngularFire (2.0.0-beta.2) を待機してログイン ステータスを確認し、ユーザーをログインさせるルーター ガードを Angular.js 2 (2.0.0-rc.4) (angular cli で作成) に記述しようとしています (匿名で) ユーザーが状態に許可する前にまだログインしている場合。

私のガードコードは次のとおりです。

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;
      });
 }

アプリケーションを実行すると、 my routeを返すことがアクティブ化されていないTEST 1000ことを示すコンソール出力が表示されます。canActivate()true

私の論理に誤った考え方があるのでしょうか、それともこれを賢くデバッグするための明るいアイデアがあるのでしょうか。

4

2 に答える 2

3

現在、これを使用して認証を確認し、ユーザーが管理者であるかどうかを確認しています:

認証サービス:

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$;

  }

}

認証ガード サービス:

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();

  }

さて、これがあなたの質問にどのように関係しているかというと、 を呼び出さないと機能complete()admin$ないということです。コンソールはログに記録しますtrueが、ルーターは次の状態に移動しません。

私はまだオブザーバブルのコツをつかんでいます(したがって、実装が不十分です)。コードを修正する場合は、最終結果を見てみたいと思います。それ。乾杯!

于 2016-07-25T21:38:46.717 に答える
2

これで問題が解決するかどうかテストできますか

canActivate() {

    this.auth
      .subscribe(auth => {
          if (!auth) this.auth.login()
       });
    let authObs = this.auth
      .asObservable()
      .filter(auth => auth ? true : false)
      .map(x => {
          console.log("TEST 1000");
          return true;
       });

    authObs.subscribe(a => return true);

問題は、オブザーバブルを作成するだけで、実際にサブスクライブしていないことだと思います。CanActivate は、オブザーバブルではない promise または bool を想定しています。

于 2016-07-25T08:09:38.797 に答える