如何在特定的注入环境中提供角度保护?

问题描述 投票:0回答:1

我有一个单一存储库,其中包含多个应用程序以及一些共享库。我想做的是为应用程序中的某些页面实现

authGuard
,但是我遇到的问题是,在路由器的上下文中,我的
AuthService
没有提供程序。

这是因为

AuthService
的依赖关系如下所示:

AuthService -> FirebaseAuthService -> FirebaseAppService -> EnvironmentService

最重要的是,我试图防止服务和模块被不必要地初始化。因此,只有当我尝试导航到需要身份验证的页面,或者我位于身份验证页面时(理想情况下,我会有一些不需要身份验证的信息页面),才应初始化

AuthService

尝试将我的防护包裹在

runInInjectionContext
中似乎会让事情变得更糟,因为我不仅不能使用
NgModule
类型作为
Injector
参数的值,而且还可以以满足的方式编写第二个参数的函数
CanMatchFn
规格使得错误更多。

由于应用程序环境的初始化过程,我真的无法在“root”中提供

AuthService

angular typescript angular18 angular-di
1个回答
0
投票

您可以使用可选的注入:

export class AuthGuard {
    constructor(@Optional() private authService: AuthService) {}
}

export function authGuard(): CanActivateFn {
    return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
        const authService = inject(AuthService, { optional: true });
        ...
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.