2017-08-14 27 views
6

Aynı yönlendirici url canActivate kontrol Nasıl zorlamak için AuthGuardAngular2: yönlendirici ile sayfayı yeniden yükleme (yeniden canActivate) nasıl?

canActivate: [ AuthGuard ] ve doğrulama ile yönlendiricileri var?

Örneğin: Geçerli rota /admin ve session expired gibi bir olayım var. AuthGuard oturum kontrolüm var ancak bu kontrol sadece .navigate(...)'u çalıştırdığımda etkinleşiyor. canActivate'u aynı yerde çalıştırmaya nasıl zorlanır?

Denedim: this.router.navigate([ this.router.url ]); ama açısal aynı konumu kontrol eder ve hiçbir şey yapmaz.

p.s. session expired event aldığımda "giriş sayfası" veya diğer sayfaları bulabilirim, ancak AuthGuard içinde tüm yönlendirmeler var ve diğer tüm olaylarda aynı yönlendirmeleri tekrarlamak istemiyorum, sadece location.reload() gibi ancak Angular2 yollarında ihtiyacım var.

Ana soru gibi geliyor: Geçerli konumda rerun canActivate korumalarını zorlamak nasıl?

cevap

2

Benim geçici çözüm:

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 }, 

Bu kod tekrar AuthGuard çalışır.

+0

Mükemmel çözüm, mükemmel çalışır! Başka bir araştırma yaptım ve seninle karşılaştığım en iyisiydi. Bunu iyileştirmenin bir yolunu buldun mu? İhtiyacı değil, sadece meraklı. –

+0

@JulianFraser nope, şu ana kadar prod olarak kullandım – MixerOID

İlgili konular