यहां मेरा इस पर ध्यान देना और अनुपलब्ध प्रदाता समस्या का एक संभावित समाधान है।
मेरे मामले में, हमारे पास एक गार्ड है जो पैरामीटर के रूप में अनुमति की अनुमति या सूची लेता है, लेकिन यह एक ही बात है जिसमें एक भूमिका है।
हमारे पास अनुमति के साथ या बिना सुरक्षा गार्ड से निपटने के लिए एक वर्ग है:
@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,
]
उम्मीद है की यह मदद करेगा।