我是Angular身份验证防护的新手。我已经成功集成了身份验证防护,以便登录用户可以访问私有页面。为此,我使用了@Directive({
selector: '[customMax][formControlName],[customMax][formControl],[customMax][ngModel]',
providers: [{provide: NG_VALIDATORS, useExisting: CustomMaxDirective, multi: true}]
})
export class CustomMaxDirective implements Validator {
@Input()
customMax: number;
validate(c: FormControl): {[key: string]: any} {
let v = c.value;
return ( v > this.customMax)? {"customMax": true} : null;
}
。现在,我的目的是使用另一种保护措施,以防止已登录的用户访问某些私有页面。
从https://www.concretepage.com/angular-2/angular-2-4-route-guards-canactivate-and-canactivatechild-example开始,我知道可以使用CanActivate
来达到类似的效果。
在canActivateChild
文件中,我使用了以下内容:
app-routing.module.ts
在const routes: Routes = [ ...
{ path: 'myaccount', loadChildren: '../module/myaccount/myaccount.module#MyAccountModule',canActivate: [AuthGuard] },...];
组件下,我还有其他几个子组件。
我在myaccount
中写道:
myaccount-routing.module.ts
在const routes: Routes = [
...
{ path: 'abc', component: AbcComponent,
children: [
{ path: 'xyz', component: XyzComponent, canActivateChild: [ AuthGuard ] },
... ]
}
];
下的abc
组件中,我在myaccount
内写了以下内容:
abc-routing.module.ts
这是我的const routes: Routes = [
...
{ path: 'xyz', component: XyzComponent, canActivateChild: [ AuthGuard ]},
...
];
:
auth.guard.ts
从浏览器说import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild} from '@angular/router';
import { CommonService } from './../services/common.service';
@Injectable()
export class AuthGuard implements CanActivate {
private userData:any={};
constructor(
private router: Router,
private commService : CommonService
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
...
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any {
console.log("fired!);
return true;
}
}
到xyz页面时,它应该触发浏览器控制台,但是,我在浏览器控制台中看不到任何文本。 CLI中也没有错误。我刷新了myaccount/abc/xyz
页面,但是没有运气。浏览器控制台中没有文本。有想法吗?
答案 0 :(得分:1)
您在哪里提供AuthGuard
?,在示例中根本没有提供。您可以将其更改为@Injectable({providedIn:'root'})
编辑
看看这个stackblitz,当它有一个父canActivateChild
时,就好像canActivate
被触发了。如果您需要在特定页面上执行验证,则应在要保护的页面上添加另一个canActivate