这是我的看法,也是针对缺少的提供程序问题的可能解决方案。
以我为例,我们有一个将权限或权限列表作为参数的防护,但是具有作用的是同一件事。
我们有一个用于处理经过授权或未经授权的auth Guard的类:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
这涉及检查用户活动会话等。
它还包含用于获取自定义权限保护的方法,该方法实际上取决于AuthGuardService
自身
static forPermissions(permissions: string | string[]) {
@Injectable()
class AuthGuardServiceWithPermissions {
constructor(private authGuardService: AuthGuardService) { } // uses the parent class instance actually, but could in theory take any other deps
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
// checks typical activation (auth) + custom permissions
return this.authGuardService.canActivate(route, state) && this.checkPermissions();
}
checkPermissions() {
const user = ... // get the current user
// checks the given permissions with the current user
return user.hasPermissions(permissions);
}
}
AuthGuardService.guards.push(AuthGuardServiceWithPermissions);
return AuthGuardServiceWithPermissions;
}
这使我们能够使用该方法基于路由模块中的权限参数来注册一些自定义防护:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
有趣的部分forPermission
是AuthGuardService.guards.push
-这基本上可以确保forPermissions
在调用任何时间来获取自定义防护类时,也会将其存储在此数组中。这在主类上也是静态的:
public static guards = [ ];
然后,我们可以使用该数组来注册所有的守护程序-可以,只要确保在应用模块注册这些提供程序时,已经定义了路由并创建了所有的守护程序类(例如,检查导入顺序和将这些提供者的数量保持在列表中尽可能低的位置-使用路由模块有帮助):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
希望这可以帮助。