これが私の見解であり、不足しているプロバイダーの問題に対する可能な解決策です。
私の場合、許可または許可のリストをパラメーターとして受け取るガードがありますが、これは役割を持つのと同じことです。
許可の有無にかかわらず、認証ガードを処理するためのクラスがあります。
@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,
]
お役に立てれば。