2016-11-22 212 views
1

我有一個登錄系統,當且僅當我們登錄時,才能訪問模塊。如果我們不是,並且會話已過期,那麼我會重定向到登錄頁面,並保存會話存儲我們所在的頁面,因此如果用戶嘗試再次登錄,他會回到他所在的頁面。 但是,我有我的後衛一個問題:Angular2衛士和路由器

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private _router: Router, private _authUtils: AuthUtils) {} 

    canActivate(): boolean { 
    if(this._authUtils.isLogged()) { 
     return true 
    } 
    else { 
     window.sessionStorage.setItem('previousPage', this._router.url) 
     let link = ["/login", { previous: "true" }] 
     this._router.navigate(link) 
     return false 
    } 
    } 
} 

問題來自於一個事實,即this._router.url尚未初始化,因此「/」每次都返回。如果我強迫它等於我的路線路徑之一,那麼它工作得很好。任何想法如何解決這個問題?

乾杯!

編輯:

以下是我在我的應用程序,routing.module.ts:

@NgModule({ 
    imports: [ 
     RouterModule.forRoot([ 
       { 
        path: 'myApp', 
        loadChildren: 'app/myApp.module#MyAppModule', 
        canActivate: [AuthGuard] 
       }, 
       { 
        path: 'login', 
        component: LoginComponent, 
        data: { 
         name: 'login' 
        } 
       }, 
       { 
        path: '**', 
        redirectTo: '/login', 
        pathMatch: 'full' 
       } 
      ] 
     ) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 

export class AppRoutingModule {} 
+0

請您app.module,你宣佈你AuthGuard添加代碼。 – Maxime

+0

你想在那看到什麼,我的意思是它出現在我的提供者中:as:AuthGuard – Scipion

回答

0

你可以使用RouterStateSnapshotcanActivate paramater得到當前的URL。

示例Plunker

所以,我認爲你可以改變你的AuthGuard到:

import { 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot, 
    CanActivate 
} from '@angular/router'; 

// other import .... 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private _router: Router, private _authUtils: AuthUtils) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    if(this._authUtils.isLogged()) { 
     return true 
    } 
    else { 
     window.sessionStorage.setItem('previousPage', state.url) 
     let link = ["/login", { previous: "true" }] 
     this._router.navigate(link) 
     return false 
    } 
    } 
}