2016-06-25 9 views
3

Я реализую Guard CanActivate для перенаправления пользователя на страницу входа в систему, если их сессия недействительна.Угловой 2-маршрутизатор - CanActivate Guard

Проверка того, является ли сеанс действительным или нет, осуществляется через службу, и поэтому от охранника я подписываюсь на вызов службы, чтобы получить состояние действительности сеанса.

Я отлаживал код, и все, кажется, работает так, как должно, на самом деле, когда сеанс недействителен, приложение перенаправляет обратно на страницу входа. Однако, когда я возвращаю true с охраны, страница не загружается.

Мой код похож на то, что указано на Angular documentation (Code on Plunker).

Я не уверен, внедрил ли я что-то неправильно в самом охраннике. Разница, которую я вижу, заключается в том, что охранник обращается к собственности в службе - но я не думаю, что это должно иметь большое значение. Из того, что я могу понять, возвращение true от охранника просто продолжит нормальную операцию маршрутизации.

Примечание: Я использую Угловое RC3

Код:

Guard

export class MyGuard implements CanActivate { 
    constructor(private checkSessionService: CheckSessionService, private router: Router) {} 

    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
    ) { 
     this.checkSessionService.checkUserSession(localStorage.getItem('userToken')) 
     .subscribe(validSessionReturn => { 

      if (validSessionReturn) { 
       return true; 
      } else { 
       // redirect to login 
       this.router.navigateByUrl('/login'); 
       return false; 
      } 
     }, 
     error => console.log(error)); 
    } 
} 

Редактировать

Я Inve и все выглядит так, как будто проблема связана с тем, что я пытаюсь вернуть boolean из самого метода подписки. В качестве теста я попробовал следующее и все работало, как ожидалось:

export class MyGuard implements CanActivate { 
    constructor(private checkSessionService: CheckSessionService, private router: Router) {} 

    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
    ) { 
     if(localStorage.getItem('userToken') !== null) { 
      return true; // or return Observable.of(true); 
     } else { 
      return false; // or return Observable.of(false); 
     } 
    } 
} 

Вы можете заметить из приведенного выше кода, который можно вернуть либо boolean или Observable<boolean>. CheckSessionService Я реализовал возвращает Observable<boolean>. На самом деле, когда я попытался код ниже, еще раз все работало, как ожидалось, а это означает, что если сессия действительна страница успешно загружена, иначе маршрутизация останавливается:

export class MyGuard implements CanActivate { 
    constructor(private checkSessionService: CheckSessionService, private router: Router) {} 

    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
    ) { 
     return this.checkSessionService.checkUserSession(localStorage.getItem('userToken')); 
    } 
} 

Однако с приведенным выше примером, я не могу найти способ перенаправления на определенную страницу на основе значения, полученного службой. Теперь мой вопрос заключается в том, есть ли способ проверить результат this.checkSessionService.checkUserSession(localStorage.getItem('userToken')) без метода подписки или есть другой способ возврата из метода subscribe. Я попытался:

if(this.checkSessionService.checkUserSession(localStorage.getItem('userToken')) === Observable.of(false)) 

но, как и ожидалось, он не работал.

ответ

2

Заменить

this.checkSessionService... 

по

return this.checkSessionService... 

Вместо подписки на наблюдаемую и вернуть subscrption, вы также должны вернуть наблюдаемым себя, но и подключить что-то в случае, если оно ложно:

return this.checkSessionService.checkUserSession(localStorage.getItem('userToken')) 
    .do(‌​function(authenticated) { 
     if (!authenticated) ... 
    }); 
+0

Я действительно давал это раньше. Однако при выполнении этого кода я бы возвращал 'Subscription' вместо' boolean' или 'Observable ', который не разрешен. Я уверен, что код, который у меня есть, в порядке, просто при возврате 'true' он действует так, как будто я возвращаю' false' и останавливает операцию маршрутизации. –

+0

Ваш ответ, кажется, указал мне в правильном направлении, но у меня есть незначительная проблема, я обновил вопрос своими выводами. –

+1

Да, я слишком быстро отвечал на вопросы и смущал обещания с Обсервалами. В принципе, вам нужно вернуть Observable , что и возвращает ваша служба, но вы также должны сделать что-то, если логическое значение false. Это то, что позволяет оператор do делать. http://reactivex.io/documentation/operators/do.html. 'return this.checkSessionService.checkUserSession (localStorage.getItem ('userToken')). ​​do (function (authenticated) {if (! authenticated) ...}); –

Смежные вопросы