Tôi đang cố gắng sử dụng bộ bảo vệ bộ định tuyến Angular2 để hạn chế quyền truy cập vào một số trang trong ứng dụng của mình. Tôi đang sử dụng Xác thực Firebase. Để kiểm tra xem một người dùng đăng nhập với căn cứ hỏa lực, tôi phải gọi .subscribe()
trên FirebaseAuth
đối tượng với một callback. Đây là mã cho người bảo vệ:
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AngularFireAuth } from "angularfire2/angularfire2";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AngularFireAuth, private router: Router) {}
canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean>|boolean {
this.auth.subscribe((auth) => {
if (auth) {
console.log('authenticated');
return true;
}
console.log('not authenticated');
this.router.navigateByUrl('/login');
return false;
});
}
}
Khi điều hướng đến một trang có bảo vệ trên đó authenticated
hoặc not authenticated
được in ra bảng điều khiển (sau một thời gian chờ đợi phản hồi từ firebase). Tuy nhiên, việc điều hướng không bao giờ hoàn thành. Ngoài ra, nếu tôi chưa đăng nhập, tôi sẽ được chuyển hướng đến /login
tuyến đường. Vì vậy, vấn đề tôi đang gặp phải là return true
không hiển thị trang được yêu cầu cho người dùng. Tôi giả sử điều này là do tôi đang sử dụng một lệnh gọi lại, nhưng tôi không thể tìm ra cách làm khác. Có suy nghĩ gì không?