Abh*_*nay 3 angular-routing angular auth-guard angular-guards angular8
全部,
在实施身份验证保护之前,我能够在登录和注册屏幕中隐藏我的导航栏。通过读取 component.ts 中的路由事件并通过 ngIf 隐藏导航栏。在我实现了 auth guard 后,auth guard 到登录页面的路由没有隐藏下面的导航栏是我的代码..
在这里,我的 auth 守卫服务将检查用户是否通过 auth 服务(将从 cognito 获取数据)进行身份验证。现在,我怎样才能从 auth 守卫发生的路线中隐藏导航栏。请帮忙
应用程序组件.html
<app-toolbar *ngIf="isShowNavbar" ></app-toolbar>
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)
app.component.ts
import { Component,OnInit } from '@angular/core';
import {AuthorizationService} from "./authorization.service";
import { Router, ActivatedRoute, UrlSegment, NavigationEnd } from '@angular/router';
import { Observable } from 'rxjs';
import { first, distinctUntilChanged, throttleTime } from '../../node_modules/rxjs/operators';
@Component({
// tslint:disable-next-line: component-selector
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
isLoggedIn$: Observable<boolean>;
isShowNavbar: boolean;
constructor(private auth: AuthorizationService,private router: Router) {}
ngOnInit() {
this.isLoggedIn$ = this.auth.IsLoggedIn;
this.router.events.pipe(throttleTime(100), distinctUntilChanged()).subscribe((navEnd: NavigationEnd) => {
console.log(navEnd.url)
if (navEnd) {
if (navEnd.url === "/login" || navEnd.url ==="/register" ) {
this.isShowNavbar = false
} else {
this.isShowNavbar = true;
}
}
});
}}
Run Code Online (Sandbox Code Playgroud)
路由文件
const routes: Routes = [
{path: '', redirectTo: '/cards', pathMatch: 'full',canActivate : [ AuthGuardService ] },
{ path: 'shareditems', component: ShareditemsComponent,canActivate : [ AuthGuardService ] },
{ path: 'home', component: AppCardsComponent,canActivate : [ AuthGuardService ] },
{ path: 'calendar', component: CalendarComponent,canActivate : [ AuthGuardService ] },
{path: 'lan', component: LanComponent,canActivate : [ AuthGuardService ] },
{path:'login', component:LoginComponent},
{path: 'register', component:RegisterComponent },
{path:'nav', component:CommonComponent,canActivate : [ AuthGuardService ] }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Run Code Online (Sandbox Code Playgroud)
auth.guard 服务:
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean>
{
return this.auth.isAuthenticated()
.then(data => {
return Promise.resolve(true);
}).catch(err => {
this._router.navigate(['/login']);
return Promise.resolve(false);
});
}
}
Run Code Online (Sandbox Code Playgroud)
我不会根据当前 URL 显示或隐藏您的工具栏,而是构建您的路由并使用布局组件。
认证布局.component.html
<app-toolbar></app-toolbar>
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)
匿名layout.component.html
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)
您可以通过使用路由子项来继承这些布局(和 auth 保护)。
路由文件
const routes: Routes = [
{ path: '', component: AuthenticatedLayoutComponent, canActivate : [ AuthGuardService ],
children: [
{ path: '', redirectTo: '/cards', pathMatch: 'full' },
{ path: 'shareditems', component: ShareditemsComponent },
{ path: 'home', component: AppCardsComponent },
{ path: 'calendar', component: CalendarComponent },
{ path: 'lan', component: LanComponent },
{ path:'nav', component: CommonComponent }
] },
{ path: '', component: AnonymousLayoutComponent, children: [
{ path:'login', component: LoginComponent},
{ path: 'register', component: RegisterComponent },
] }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Run Code Online (Sandbox Code Playgroud)
演示:https : //stackblitz.com/edit/angular-jzmw3d
最终,您的逻辑是您只想在用户登录时显示导航栏。您可以通过订阅身份验证服务来设置可见性。
app.component.ts
export class AppComponent implements OnInit {
isLoggedIn$: Observable<boolean>;
isShowNavbar: boolean;
constructor(private auth: AuthorizationService,private router: Router) {}
private destroyed$ = new Subject();
ngOnInit() {
this.isLoggedIn$ = this.auth.IsLoggedIn;
this.isLoggedIn$.pipe(
takeUntil(this.destroyed$)
).subscribe(isLoggedIn => {
this.isShowNavbar = isLoggedIn;
});
}
ngOnDestroy() {
this.destroyed$.next();
this.destroyed$.complete();
}
}
Run Code Online (Sandbox Code Playgroud)
不过,我仍然建议在父级中使用带有单个身份验证保护的子路由。
此外,如果您想指示路由器导航到新路线,我建议您返回UrlTree
from canActivate
。
auth-guard.service.ts
canActivate (next: ActivatedRouteSnapshot, state: RouterStateSnapshot
): Promise<boolean | UrlTree> {
return this.auth.isAuthenticated()
.then(data => {
return Promise.resolve(true);
}).catch(err => {
const urlTree = this._router.parseUrl('/login');
return Promise.resolve(urlTree);
});
};
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1442 次 |
最近记录: |