Угловые маршруты к корню сервера

#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), пользователь должен пройти проверку подлинности, верно? И аутентификация выполняется в компоненте входа в систему. Я прав?