2017-08-14 20 views
6

Tôi có router với canActivate: [ AuthGuard ] và xác nhận bên AuthGuardAngular2: làm thế nào để "tải lại" trang với bộ định tuyến (kiểm tra lại có thể kích hoạt)?

Làm thế nào để buộc kiểm tra canActivate trong cùng một url router? Ví dụ: Tuyến đường hiện tại là /admin và tôi đã có sự kiện như session expired. Tôi có kiểm tra phiên trong AuthGuard nhưng kiểm tra này chỉ kích hoạt khi tôi thực hiện .navigate(...). Làm thế nào để lực lượng chạy canActivate ở cùng một vị trí?

Tôi đã thử: this.router.navigate([ this.router.url ]); nhưng góc kiểm tra cùng một vị trí và không làm gì cả.

p.s. Tôi có thể tìm đến "trang đăng nhập" hoặc các trang khác khi tôi nhận được session expired event, nhưng tôi có tất cả chuyển hướng bên trong AuthGuard và tôi không muốn lặp lại cùng một chuyển hướng trong tất cả các sự kiện khác, tôi cần giống như location.reload() nhưng trong các tuyến đường Angular2.

Câu hỏi chính có vẻ như: Cách buộc chạy lại canActivate bảo vệ ở vị trí hiện tại?

Trả lời

2

giải pháp tạm thời của tôi:

auth.service.ts

import { Injectable, Injector } from '@angular/core'; 
import { ActivatedRoute, Router, RouterStateSnapshot } from '@angular/router'; 

@Injectable() 
export class AuthService { 

    constructor(private route: ActivatedRoute, 
       private router: Router, 
       private injector: Injector) { 
    this.forceRunAuthGuard(); 
    } 

    // Dirty hack for angular2 routing recheck 
    private forceRunAuthGuard() { 
    if (this.route.root.children.length) { 
     // gets current route 
     const curr_route = this.route.root.children[ '0' ]; 
     // gets first guard class 
     const AuthGuard = curr_route.snapshot.routeConfig.canActivate[ '0' ]; 
     // injects guard 
     const authGuard = this.injector.get(AuthGuard); 
     // makes custom RouterStateSnapshot object 
     const routerStateSnapshot: RouterStateSnapshot = Object.assign({}, curr_route.snapshot, { url: this.router.url }); 
     // runs canActivate 
     authGuard.canActivate(curr_route.snapshot, routerStateSnapshot); 
    } 
    } 

} 

app.routes.ts

{ path: 'faq', canActivate: [ AuthGuard ], component: FaqComponent }, 
    { path: 'about', canActivate: [ AuthGuard ], component: AboutUsComponent }, 
    { path: 'upgrade', canActivate: [ AuthGuard ], component: UpgradeComponent }, 

Mã này chạy AuthGuard một lần nữa.

+0

Giải pháp tuyệt vời, hoạt động hoàn hảo! Tôi đã làm một số nghiên cứu khác và của bạn là tốt nhất tôi đi qua. Bạn có tìm cách cải thiện điều này không? Không phải là nó cần nó, chỉ tò mò thôi. –

+0

@JulianFraser nope, tôi đã sử dụng nó trong sản phẩm cho đến bây giờ – MixerOID

Các vấn đề liên quan