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 đó authenticatedhoặ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 /logintuyến đường. Vì vậy, vấn đề tôi đang gặp phải là return truekhô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?