İşte benim bu konudaki yaklaşımım ve eksik sağlayıcı sorunu için olası bir çözüm.
Benim durumumda, parametre olarak bir izin veya izin listesi alan bir korumamız var, ancak aynı şeyin bir rolü var.
Yetkilendirme korumaları ile izinli veya izinsiz ilgilenmek için bir sınıfımız var:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Bu, kullanıcının aktif oturumunu vb. Kontrol etmekle ilgilidir.
Aynı zamanda, aslında AuthGuardService
kendine bağlı olan, özel bir izin koruması elde etmek için kullanılan bir yöntemi de içerir.
static forPermissions(permissions: string | string[]) {
@Injectable()
class AuthGuardServiceWithPermissions {
constructor(private authGuardService: AuthGuardService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.authGuardService.canActivate(route, state) && this.checkPermissions();
}
checkPermissions() {
const user = ...
return user.hasPermissions(permissions);
}
}
AuthGuardService.guards.push(AuthGuardServiceWithPermissions);
return AuthGuardServiceWithPermissions;
}
Bu, yönlendirme modülümüzdeki izinler parametresine göre bazı özel korumaları kaydetmek için yöntemi kullanmamıza olanak tanır:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
İlginç kısmı forPermission
ise AuthGuardService.guards.push
- bu temelde her zaman emin kılan forPermissions
da bu dizide depolar özel koruma sınıfı elde etmek denir. Bu aynı zamanda ana sınıfta statiktir:
public static guards = [ ];
Daha sonra tüm korumaları kaydetmek için bu diziyi kullanabiliriz - uygulama modülü bu sağlayıcıları kaydettiğinde rotaların tanımlandığından ve tüm koruma sınıflarının oluşturulduğundan emin olduğumuz sürece bu sorun olmaz (örn. İçe aktarma sırasını kontrol edin ve Bu sağlayıcıları listede olabildiğince düşük tutun - bir yönlendirme modülüne sahip olmak yardımcı olur):
providers: [
AuthGuardService,
...AuthGuardService.guards,
]
Bu yardımcı olur umarım.