Đây là lý do của tôi và giải pháp khả thi cho vấn đề thiếu nhà cung cấp.
Trong trường hợp của tôi, chúng ta có một người bảo vệ lấy quyền hoặc danh sách các quyền làm tham số, nhưng điều tương tự cũng có vai trò.
Chúng tôi có một lớp học để đối phó với những người bảo vệ xác thực có hoặc không có sự cho phép:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Điều này đề cập đến việc kiểm tra phiên hoạt động của người dùng, v.v.
Nó cũng chứa một phương thức được sử dụng để có được bộ bảo vệ quyền tùy chỉnh, điều này thực sự phụ thuộc vào AuthGuardService
chính nó
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;
}
Điều này cho phép chúng tôi sử dụng phương pháp để đăng ký một số bảo vệ tùy chỉnh dựa trên tham số quyền trong mô-đun định tuyến của chúng tôi:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
Điều thú vị forPermission
là AuthGuardService.guards.push
- điều này về cơ bản đảm bảo rằng bất kỳ lúc nào forPermissions
được gọi để có được một lớp bảo vệ tùy chỉnh, nó cũng sẽ lưu trữ nó trong mảng này. Đây cũng là tĩnh trên lớp chính:
public static guards = [ ];
Sau đó, chúng ta có thể sử dụng mảng này để đăng ký tất cả các trình bảo vệ - điều này là được miễn là chúng tôi đảm bảo rằng vào thời điểm mô-đun ứng dụng đăng ký các nhà cung cấp này, các tuyến đường đã được xác định và tất cả các lớp bảo vệ đã được tạo (ví dụ: kiểm tra thứ tự nhập và giữ cho các nhà cung cấp này càng thấp càng tốt trong danh sách - có mô-đun định tuyến sẽ giúp):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Hi vọng điêu nay co ich.