Angular получить данные из аутентификации Kerberos
У меня есть угловое приложение с бэкэндом. Проверка подлинности выполняется браузером Kerberos до запуска приложения. Ответ содержит JWT с ролями в нем.
Мой подход - дополнительный HTTP-вызов к серверу, когда приложение начинает получать учетные данные пользователей. Это реализуется с APP_INITIALIZER
в app.module.ts
, так что у меня уже есть учетные данные, когда приложение запустилось.
providers: [
...,
{
provide: APP_INITIALIZER,
useFactory: Utilitys.authServiceFactory,
deps: [AuthenticationService],
multi: true
}]
Это работает нормально. Но мой вопрос: мне нужно сделать дополнительный звонок или есть ли способ получить ответ на запрос браузера?
Если да: как это возможно?
Если нет: APP_INITIALIZER
рекомендуемый способ получить данные только один раз? Или я должен защитить все маршруты с route guard
что вызывает HTTP?
2 ответа
Чтобы получить данные только после запуска приложения, вы можете сделать это также с Route Guards
,
Вы можете определить маршрут без компонентов, который защищен защитником маршрута, например:
// Route Guard
canActivate(): boolean | Promise<boolean> | Observable<boolean> {
if (this.yourService.isAuthenticated()) {
return true;
}
return this.loginService.login();
}
// Routes
{
path: '',
canActivate: [AuthGuard],
children: [
{ path: 'comp1', component: Comp1 },
{ path: 'comp2', component: Comp2 },
...
]
}
Таким образом, каждый маршрут защищен вашей охраной, и вы можете проверить, авторизован ли ваш пользователь для доступа к вашему приложению.
Обратите внимание, что ваши обычные компоненты будут дочерними для некомпонентного защищенного маршрута.
После дополнительных исследований я не нашел решения для получения информации о пользователях без дополнительного http-вызова на сервер.
APP_INITIALIZR
отлично работал для моего первоначального варианта использования. Но позже мой AuthenticationService
расширялись и APP_INITIALIZR
не может обрабатывать сервисы, которым нужно внедрить маршрутизатор из-за циклической зависимости. Поэтому я рекомендую найти лучший способ, чем использовать APP_INITIALIZR
получить первоначальную информацию о пользователе.