Inilah pendapat saya tentang ini dan kemungkinan solusi untuk masalah penyedia yang hilang.
Dalam kasus saya, kami memiliki penjaga yang mengambil izin atau daftar izin sebagai parameter, tetapi itu hal yang sama memiliki peran.
Kami memiliki kelas untuk menangani penjaga autentikasi dengan atau tanpa izin:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Ini berkaitan dengan memeriksa sesi aktif pengguna, dll.
Ini juga berisi metode yang digunakan untuk mendapatkan penjaga izin khusus, yang sebenarnya bergantung pada AuthGuardService
dirinya sendiri
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;
}
Ini memungkinkan kami menggunakan metode untuk mendaftarkan beberapa penjaga khusus berdasarkan parameter izin di modul perutean kami:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
Bagian yang menarik dari forPermission
adalah AuthGuardService.guards.push
- ini pada dasarnya memastikan bahwa setiap saat forPermissions
dipanggil untuk mendapatkan kelas penjaga khusus, ia juga akan menyimpannya dalam larik ini. Ini juga statis di kelas utama:
public static guards = [ ];
Kemudian kita dapat menggunakan larik ini untuk mendaftarkan semua penjaga - tidak apa-apa selama kita memastikan bahwa pada saat modul aplikasi mendaftarkan penyedia ini, rute telah ditentukan dan semua kelas penjaga telah dibuat (misalnya, periksa urutan impor dan pertahankan penyedia ini serendah mungkin dalam daftar - memiliki modul perutean membantu):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Semoga ini membantu.