#angular #routes #single-sign-on
#угловые #маршруты #единый вход
Вопрос:
Мое приложение имеет следующую конфигурацию маршрута:
const rootRoutes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ path: 'login', component: LoginComponent },
{ path: 'home', component: HomeComponent, canActivate: [AuthenticationGuard] }, // if unauthenticated, goes to LoginComponent
{ path: '**', component: PageNotFoundComponent }
];
И URL-адреса:
локальная среда
локальный хост: 4200
СИДЕТЬ
sit.company.com
UAT
uat.company.com
ПРОИЗВОДСТВО
company.com
В моем приложении есть функция единого входа (SSO) с использованием IBM WebSEAL, так что при первом посещении пользователем sit.company.com или uat.company.com или company.com , он будет перенаправлен на страницу входа в систему, предоставленную другой нашей командой для аутентификации.
В моей локальной среде, поскольку такая функция единого входа не реализована, поэтому пользователь будет перенаправлен на LoginComponent для аутентификации.
Моя проблема в том, что у меня есть два места, где я пытаюсь перенаправить на страницу единого входа сервера, как показано ниже. Однако он возвращается только к LoginComponent, но никогда не сможет вернуться на страницу единого входа sit.company.com или uat.company.com или company.com . Как это решить?
login.component.ts
ngOnInit() {
if (environment.production) {
this.router.navigate(['/']); // route to server's root page for SSO login
}
}
onSignIn() {
if (!isNullOrUndefined(this.username)) {
this.loginSub = this.authenticateService.login(this.username)
.subscribe(user => {
this.router.navigate(['/home']);
});
}
}
onSignOut() {
this.authenticateService.logout();
}
аутентификация-guard.ts
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.authenticateService.isAuthenticatedWithBackend()
.pipe(
map(user => {
const userDetails: UserDetails = {
userId: user.username,
username: user.uacUser.userName
};
if (userDetails) {
this.authenticateService.setCurrentUser(userDetails);
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}),
catchError(e => {
this.router.navigate(['/login']);
return of(false);
})
);
}
abc-page.component.html
<a class="nav-link" [routerLink]="'/'">root page</a>
p.s. Я использую Angular 9
Комментарии:
1. можете ли вы добавить более подробную информацию о компоненте входа, домашнем компоненте и authguard здесь?
2. @ArunkumarRamasamy, я добавил фрагменты кода в сообщение. Спасибо.
3. @Angus this.router.navigate([‘/’]) всегда будет переходить к домашнему компоненту, у которого есть authguard, который перенаправляет на login, но в компоненте login у вас есть перенаправление обратно на home (если env является prod), там вы должны проверить, аутентифицирован ли пользователь или нет.
4. @laiju, но я не уверен, как реализовать переход к корню приложения (т.е. sit.company.com или uat.company.com или company.com ) если я не использую этот.router.navigate([‘/’]).
5. @Angus Можете ли вы объяснить требование немного более четко. Чтобы получить доступ к маршруту веб-сайта (home), пользователь должен пройти проверку подлинности, верно? И аутентификация выполняется в компоненте входа в систему. Я прав?