仅当没有查询字符串时才激活AuthenticationGuard

时间:2019-02-06 19:59:54

标签: angular angular2-routing angular7 adal

我构建了一个Angular 7.0.4单页应用程序,该应用程序将由两种不同类型的用户访问。一种将在Azure AD上设置其标识,而另一种则不会。

因此,当我的应用程序针对第一组用户启动时,将使用ADAL对他们进行身份验证。对于第二组用户(没有AD身份),将有一个Windows应用程序,该应用程序将获取其登录信息,然后通过将其ID作为查询字符串参数传递来启动网站。

因此,对于第一组用户,我的网站URL看起来像

https://my.application.com/

第二组用户将是

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

我正在尝试以仅当没有查询字符串参数时才进行身份验证的方式配置路由。

有什么办法可以实现?

谢谢, Shreeram

我已经为我的应用设置了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 :(得分:0)

您的带有查询字符串参数的请求仍在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
        }
    }


}

希望有帮助。