Tôi đang xem xét thiết kế giao diện của mình và tôi đang đấu tranh để quyết định đâu là cách "chính xác" nhất để thực hiện kiểm soát truy cập dựa trên vai trò, đưa ra một uservà một subjectđiều mà chúng tôi usermuốn truy cập.
Theo như tôi có thể thấy tôi có ba tùy chọn cốt lõi (với thứ tư là một sự khốn của ba thứ nhất và một thứ năm là một tinh chỉnh của thứ tư):
- Truy vấn
subjectdanh sách các quyền màusercó -subject.allowAccess(user.getPermissionSet) - Truy vấn
userdanh sách các quyền màsubjectyêu cầu -user.hasPermissionTo(subject.getRequiredPermissions()) - Truy vấn bên thứ ba để xác định vị trí giao điểm của quyền -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Truy vấn
subject/user, trong khi ủy thác "quyết định" cho lớp bên thứ ba - Có
usernỗ lực truy cậpsubjectvà ném lỗi nếu không cho phép truy cập
Tôi đang nghiêng về tùy chọn bốn - Có subjectmột accessControllertrường chứa , trong đó các lệnh gọi để subject.userMayAccess(User user)ủy quyền cho hoạt động a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. nhưng sau đó điều này đặt ra câu hỏi thêm:
- nên
accessControllerlà một trường so với một lớp tĩnh ..? - Có nên
subjectbiết những quyền nào được yêu cầu để có thể xem nó không? - nguyên tắc của kiến thức tối thiểu xuất hiện ở đây, liên quan đến việc gọi điện thoại ở
subject.display()đâu? Người gọi cósubject.display()bao giờ nên biết rằng kiểm soát truy cập có hiệu lực? (nơisubject.display()là "phương thức mẫu" cuối cùng) - đã
subject.display()quản lý kiểm soát truy cập, đưa ra một ngoại lệ mà người dùng không có quyền yêu cầu?
Điều gì sẽ được coi là "thực hành tốt nhất" trong tình huống này? Trường hợp nào trách nhiệm để thực hiện kiểm tra thực sự xảy ra?
Vì đây phần nào là một bài tập học thuật mà sau đó sẽ tiến hành triển khai, các tài liệu tham khảo về các mẫu thiết kế sẽ được đánh giá cao.