Активируйте AuthenticationGuard, только если нет строки запроса - PullRequest
0 голосов
/ 06 февраля 2019

Я создал одностраничное приложение Angular 7.0.4, к которому будут обращаться два разных типа пользователей.Один тип будет иметь свою идентификацию в Azure AD, а другой - нет.

Итак, мое приложение при запуске для первого набора пользователей будет аутентифицировать их с помощью ADAL.Для второго набора пользователей (у которых нет идентификатора AD), будет приложение Windows, которое извлечет их регистрационную информацию и затем запустит веб-сайт, передав свой Id в качестве параметра строки запроса.

Так, для первого набора пользователей URL моего веб-сайта будет выглядеть как

https://my.application.com/

, тогда как для второго набора пользователей это будет

https://my.application.com/?Id=12345

I 'Я пытаюсь настроить мои маршруты таким образом, чтобы аутентификация происходила только при отсутствии параметра строки запроса.

Есть ли способ добиться этого?

Спасибо, Шрирам

Я настроил ADAL для своего приложения и попытался настроить маршруты таким образом


import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AuthenticationGuard } from 'microsoft-adal-angular6';
import { DashboardComponent } from './dashboard/dashboard.component';

const routes: Routes = [
  { path: '', component: DashboardComponent, pathMatch: 'full', canActivate: [AuthenticationGuard] },
  { path: '?Id', component: DashboardComponent}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Но даже когда я передаю параметр строки запроса, он все равно аутентифицирует запрос.

1 Ответ

0 голосов
/ 07 февраля 2019

Ваши запросы с параметрами строки запроса все еще попадают в AuthenticationGuard, потому что ваша маршрутизация настроена так.RouterModule не заботится о том, есть ли параметры запроса или нет, и он всегда будет перенаправлять на пустой путь в вашем примере.

Итак, чтобы предотвратить блокировку ваших запросов AuthenticationGuard с помощью 'Id', вывам нужно будет изменить свою маршрутизацию следующим образом:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AuthenticationGuard } from 'microsoft-adal-angular6';
import { DashboardComponent } from './dashboard/dashboard.component';

const routes: Routes = [
  { path: '', component: DashboardComponent, pathMatch: 'full', canActivate: [AuthenticationGuard] },
  // { path: '?Id', component: DashboardComponent} <=== remove this line
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

, а затем вы можете поместить оператор if-else внутри вашей AuthenticationGuard следующим образом:

import { AuthenticationService } from "./authentication.service";
import { CanActivate, RouterStateSnapshot, ActivatedRouteSnapshot, Router, CanLoad, Route } from "@angular/router";
import { Injectable } from "@angular/core";

@Injectable()
export class AuthenticationGuard implements CanActivate {

    constructor(private authenticationService: AuthenticationService,
                            private route: Router) {}

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        if (state.url.indexOf('Id') > -1 { // Id exists
            return true;
        }
        else {
            // rest of your logic here
        }
    }


}

Надеюсь, это поможет.

...