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