İşte bu benim ve benim için eksik sağlayıcı sorunu için olası bir çözüm.
Benim durumumda, izin veya izinler listesini parametre olarak alan bir bekçi var, ancak aynı şeyin bir rolü var. kullanıcı aktif oturumu, vb kontrol ile
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Bu fırsatlar:
onlarla veya izinsiz olarak auth korumaları ile başa çıkmak için bir sınıf var
Ayrıca aslında Bu bize izinler parametreye dayalı bazı özel korumaları kayıt yöntemini kullanmasına izin verir
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;
}
AuthGuardService
kendisi bağlı olduğu özel izni bekçi elde etmek için kullanılan bir yöntem içerir bizim yönlendirme modülü:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
forPermission
ilginç kısmı AuthGuardService.guards.push
- bu temelde her zaman forPermissions
özel bekçi elde etmek denir emin olur sınıf ayrıca bu dizide saklayacaktır. Bu aynı zamanda ana sınıfına statik:
public static guards = [ ];
Sonra hepimiz korumaları kaydetmek için bu diziyi kullanabilirsiniz - bu biz zaman uygulama modülü bu sağlayıcılarını kaydeder emin sürece Tamam, rotalar vardı tanımlanmış ve tüm koruma sınıfları (örn onay ithalat düzeni ve listedeki mümkün olduğunca düşük bu sağlayıcılarını tutmak - bir yönlendirme modülüne sahip olur) oluşturuldu olmuştu:
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Umut bu yardımcı olur.
Mükemmel seçenek, teşekkürler. Aluan'ın fabrika metodu yaklaşımını sadece biraz daha iyi izlemeyi tercih ediyorum ama beynimi olanaklara genişletmek için teşekkürler! –
Bu güvenli midir? birisi bu verileri gönderebilir mi? – Jeff
Bu verinin güvenliğinin alakasız olduğunu düşünüyorum. Sunucu tarafında kimlik doğrulama ve yetkilendirme kullanmanız gerekir. Bence gardiyanın amacı, uygulamanızı tam olarak korumak değildir. Birisi bunu "keser" ve yönetici sayfasına giderse, sunucudan güvenli verileri almazsa sadece bence bence yönetici bileşenlerini görürsünüz. Bence bu kabul edileni çok daha iyi bir çözüm. Kabul edilen çözüm bağımlılık enjeksiyonunu kırar. – bucicimaci