Недавно я боролся с тем же. Я решил так:
В объекте компоненты определения добавить $ canActivate свойства:
import { MainController } from './main.controller';
export class MainComponent {
constructor() {
this.controller = MainController;
this.templateUrl = 'app/main/main.html';
this.$canActivate = (Auth) => {
'ngInject';
return Auth.redirectUnauthenticated();
};
}
}
Создать службу проверки подлинности, который содержит всю информацию аутентификации:
export class AuthService {
constructor($auth, UserApi, $q, $rootRouter, Storage) {
'ngInject';
this.$auth = $auth;
this.$q = $q;
this.$rootRouter = $rootRouter;
this.storage = Storage;
this.userApi = UserApi.resource;
}
/**
* Check user's status
*/
isAuthenticated() {
return this.$auth.isAuthenticated();
}
/**
* Redirect user to login page if he is not authenticated
*/
redirectUnauthenticated() {
if (!this.$auth.isAuthenticated()) {
this.$rootRouter.navigate(['Login']);
return false;
}
return true;
}
}
ПРИМЕЧАНИЯ: $ службы аутентификации приходит от satellizer библиотека.
В принципе, в каждом компоненте (к которому вы можете перейти), где вам нужен только аутентифицированный доступ, установите одно и то же свойство $ canActivate. Я не уверен, что это самое приятное решение, но оно работает :)
Я задаю себе тот же вопрос. Кажется, что одним из способов использования версии Angular's 2 является расширение RouterOutlet, но я не могу найти способ для Angular 1.5. – Boris
@Boris '$ canActivate' выглядит так, что я могу запретить доступ, если пользователь вышел из системы, возвращая обещание, которое возвращает false. Внутри я думаю, что могу '$ rootRouter.navigate ([" LogIn "])'. –
Согласен, но я надеялся на более общее решение, в котором вы можете обрабатывать аутентификацию для любого маршрута, а не для каждого компонента. – Boris