Đây là sự lựa chọn của tôi về giải pháp này và một giải pháp khả thi cho vấn đề nhà cung cấp bị thiếu.
Trong trường hợp của tôi, chúng tôi có một người bảo vệ có quyền hoặc danh sách các quyền làm thông 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 lính gác auth có hoặc không có sự cho phép:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
này đề cập đến việc kiểm tra sử dụng phiên hoạt động, vv
Nó cũng chứa một phương thức sử dụng để có được một người bảo vệ cho phép tùy chỉnh, mà thực sự là tùy thuộc vào AuthGuardService
tự
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 ta sử dụng phương pháp này để đăng ký một số lính gác tùy chỉnh dựa trên thông số điều khoản trong của chúng tôi định tuyến mô-đun:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
phần thú vị của forPermission
là AuthGuardService.guards.push
- điều này về cơ bản đảm bảo rằng bất cứ lúc nào forPermissions
được gọi là để có được một người bảo vệ tùy chỉnh lớp 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 vệ sĩ - đây là ok miễn là chúng ta chắc chắn rằng do thời gian các module ứng dụng đăng ký các nhà cung cấp, các tuyến đường có được định nghĩa và tất cả các lớp bảo vệ đã được tạo ra (ví dụ để nhập khẩu kiểm tra và giữ các nhà cung cấp càng thấp càng tốt trong danh sách - có một module định tuyến giúp):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Hope this helps.
Tùy chọn tuyệt vời là tốt, cảm ơn. Tôi thích phương pháp tiếp cận nhà máy của Aluan chỉ là một dấu vết tốt hơn mặc dù, nhưng cảm ơn đã mở rộng bộ não của tôi về khả năng! –
Tính năng này có an toàn không? ai đó có thể đăng dữ liệu này? – Jeff
Tôi nghĩ tính bảo mật của dữ liệu này không liên quan. Bạn phải sử dụng xác thực và ủy quyền trên phía máy chủ. Tôi nghĩ rằng điểm của người bảo vệ không phải là để bảo vệ hoàn toàn ứng dụng của bạn. Nếu ai đó "hack" nó và điều hướng đến trang quản trị, anh ta/cô ấy sẽ không nhận được dữ liệu an toàn từ máy chủ chỉ nhìn thấy các thành phần quản trị của bạn mà là ok theo ý kiến của tôi. Tôi nghĩ rằng đây là giải pháp tốt hơn nhiều so với một trong những chấp nhận. Các giải pháp được chấp nhận phá vỡ tiêm phụ thuộc. – bucicimaci