我遇到了以下问题:当我导航到它或浏览器刷新时,通过 AuthGuard Service保护的 personal 部分被加载两次 . 如果我提供任何URL,它第二次剥离URL的查询参数 . 这是我的app路由器配置:
const routes: Routes = [
{
path: 'search',
redirectTo: '',
pathMatch: 'full'
},
{
path: '',
component: BookmarksComponent
},
{
path: 'tagged/:tag',
component: TagComponent
},
{
path: 'about',
component: AboutComponent
},
{
path: 'personal',
loadChildren: 'app/personal/personal-bookmarks.module#PersonalBookmarksModule'
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
和子路由器配置
@NgModule({
imports: [RouterModule.forChild([
{
path: '',
component: PersonalBookmarksComponent,
canActivate: [AuthGuard],
children: [
{
path: '',
component: PersonalBookmarksListComponent
},
{
path: 'new',
component: NewPersonalBookmarkFormComponent
},
{
path: 'bookmarks/:id',
component: PersonalBookmarkDetailComponent
}
]
}
])],
exports: [RouterModule]
})
export class PersonalBookmarksRoutingModule {}
AuthGuard服务(如果它只返回true,则表示相同的行为):
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private keycloakService: KeycloakService) {}
canActivate() {
console.log('AuthGuard#canActivate called');
if (this.keycloakService.isLoggedIn()) {
return true;
} else {
this.keycloakService.login();
}
}
}
和Navbar模板:
<nav class="navbar navbar-light bg-faded" id="navbar">
<a class="navbar-brand" [routerLink]="['']" routerLinkActive="active">
<img src="assets/logo.png" width="35" height="35" class="d-inline-block align-top" alt="">
Public Bookmarks
</a>
<ul class="nav navbar-nav">
<li class="nav-item">
<a class="nav-link" [routerLink]="['personal']" routerLinkActive="active">Personal list</a>
</li>
<li class="nav-item">
<a class="nav-link" [routerLink]="['about']" routerLinkActive="active">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="http://www.codingpedia.org/tags/#codingmarks" target="_blank">Blog</a>
</li>
<li *ngIf="isLoggedIn else notLoggedIn" class="nav-item">
<a class="nav-link" (click)="logout()">Logout <i class="fa fa-lock"></i></a>
</li>
<ng-template #notLoggedIn>
<li *ngIf="!keycloakService.isLoggedIn()" class="nav-item">
<a class="nav-link" (click)="login()">Login <i class="fa fa-unlock"></i></a>
</li>
</ng-template>
</ul>
</nav>
该项目可用on Github,可通过用户名/密码登录https://www.codingmarks.org/personal测试错误行为 - test@codingmarks.org/Test_user1$
UPDATE 即使我删除 PersonalBookmarksComponent 并将 AuthGuard 移动到PersonalBookmarks模块,错误的行为仍然存在... PersonalBookmarksModule的路由如下所示:
const personalBookmarksRoutes: Routes = [
{
path: 'search',
redirectTo: '',
pathMatch: 'full'
},
{
path: '',
component: PersonalBookmarksListComponent,
canActivate: [AuthGuard],
},
{
path: 'new',
component: NewPersonalBookmarkFormComponent
},
{
path: 'bookmarks/:id',
component: PersonalBookmarkDetailComponent
}
];
UPDATE2 :删除查询参数是由于使用Keycloak登录时强制重定向 .
False :
public login(): Promise<any> {
let options: any;
options = {redirectUri: environment.HOST + 'personal'};
return new Promise<any>((resolve, reject) => {
KeycloakService.auth.login(options)
.success(resolve)
.error(reject);
});
}
Correct :
public login(): Promise<any> {
return new Promise<any>((resolve, reject) => {
KeycloakService.auth.login()
.success(resolve)
.error(reject);
});
}
2 回答
路由加载两次的原因是因为您在导航到此
' '
路由时指定了加载两个组件的路由器路径 .将路由器配置更改为
你可以执行以下两个步骤:
将authGuard移动到个人模块路由,它还将提高您的性能,因为如果用户未经过身份验证,将不会加载模块 .
删除包含空路由器插座的"PersonalBookmarksComponent"组件,而不是直接为其余组件提供路由器 .
我相信这种方法可以解决您的问题 .
警卫被召唤两次为您的组件,一次为您的孩子组件 .