นี่คือสิ่งที่ฉันทำและวิธีแก้ปัญหาที่เป็นไปได้สำหรับปัญหาผู้ให้บริการที่หายไป
ในกรณีของฉันเรามียามที่รับการอนุญาตหรือรายการการอนุญาตเป็นพารามิเตอร์ แต่สิ่งเดียวกันก็มีบทบาท
เรามีคลาสสำหรับจัดการกับเจ้าหน้าที่รักษาความปลอดภัยโดยมีหรือไม่ได้รับอนุญาต:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
สิ่งนี้เกี่ยวข้องกับการตรวจสอบเซสชันที่ใช้งานของผู้ใช้ ฯลฯ
นอกจากนี้ยังมีวิธีการที่ใช้เพื่อรับตัวป้องกันสิทธิ์แบบกำหนดเองซึ่งขึ้นอยู่กับAuthGuardService
ตัวมันเอง
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;
}
สิ่งนี้ช่วยให้เราใช้วิธีการลงทะเบียนยามที่กำหนดเองตามพารามิเตอร์สิทธิ์ในโมดูลเส้นทางของเรา:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
ส่วนที่น่าสนใจforPermission
คือAuthGuardService.guards.push
- โดยพื้นฐานแล้วจะทำให้แน่ใจว่าเมื่อใดก็ตามที่forPermissions
ถูกเรียกเพื่อรับคลาสยามที่กำหนดเองมันจะเก็บไว้ในอาร์เรย์นี้ด้วย สิ่งนี้เป็นแบบคงที่ในคลาสหลัก:
public static guards = [ ];
จากนั้นเราสามารถใช้อาร์เรย์นี้เพื่อลงทะเบียนยามทั้งหมดได้ - นี่เป็นสิ่งที่ใช้ได้ตราบเท่าที่เราตรวจสอบให้แน่ใจว่าเมื่อถึงเวลาที่โมดูลแอปลงทะเบียนผู้ให้บริการเหล่านี้เส้นทางได้รับการกำหนดและสร้างคลาสยามทั้งหมดแล้ว (เช่นตรวจสอบใบสั่งนำเข้าและ ทำให้ผู้ให้บริการเหล่านี้ต่ำที่สุดในรายการ - การมีโมดูลการกำหนดเส้นทางจะช่วยได้):
providers: [
AuthGuardService,
...AuthGuardService.guards,
]
หวังว่านี่จะช่วยได้