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 user
và một subject
điều mà chúng tôi user
muố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
subject
danh sách các quyền màuser
có -subject.allowAccess(user.getPermissionSet)
- Truy vấn
user
danh sách các quyền màsubject
yê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ó
user
nỗ lực truy cậpsubject
và 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ó subject
một accessController
trườ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
accessController
là một trường so với một lớp tĩnh ..? - Có nên
subject
biế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.