ฉันกำลังดูที่การออกแบบส่วนต่อประสานของฉันและฉันพยายามที่จะตัดสินใจว่าวิธีใดที่ "ถูกต้อง" ที่สุดในการใช้การควบคุมการเข้าถึงตามบทบาทซึ่งกำหนดไว้userและสิ่งsubjectที่userต้องการเข้าถึง
เท่าที่ฉันเห็นฉันมีสามตัวเลือกหลัก (ที่สี่เป็นลูกครึ่งของสามสามและห้าเป็นบิดของสี่):
- ค้นหา
subjectด้วยรายการสิทธิ์ที่userมี -subject.allowAccess(user.getPermissionSet) - ค้นหา
userด้วยรายการสิทธิ์ที่subjectต้องการ -user.hasPermissionTo(subject.getRequiredPermissions()) - สอบถามบุคคลที่สามเพื่อค้นหาจุดตัดสิทธิ์ -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - ค้นหาทั้ง
subject/userในขณะที่มอบหมาย "การตัดสินใจ" ให้กับบุคคลที่สามชั้น - มี
userความพยายามในการเข้าถึงsubjectและโยนข้อผิดพลาดหากไม่ได้รับอนุญาต
ฉันกำลังเอนเอียงไปทางตัวเลือกที่สี่ - มีsubjectประกอบด้วยaccessControllerข้อมูลที่โทรไปยังsubject.userMayAccess(User user)มอบหมายการดำเนินการแบบ a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. แต่เมื่อถามคำถามเพิ่มเติม:
accessControllerฟิลด์ควรเป็นคลาสคงที่ ..- ควร
subjectรู้ว่าต้องใช้การอนุญาตใดเพื่อให้สามารถดูได้ - สถานที่ที่ไม่หลักการของความรู้น้อยเข้ามาเล่นที่นี่ด้วยความเคารพโทร
subject.display()? ผู้โทรควรsubject.display()ทราบหรือไม่ว่าการควบคุมการเข้าถึงมีผลใช้งานหรือไม่ (ซึ่งsubject.display()เป็น "วิธีการแบบสุดท้าย") - มี
subject.display()การจัดการควบคุมการเข้าถึงโดยมีข้อยกเว้นเมื่อผู้ใช้ไม่ได้รับอนุญาตที่จำเป็น?
"แนวปฏิบัติที่ดีที่สุด" ในสถานการณ์นี้คืออะไร? ความรับผิดชอบในการตรวจสอบเกิดขึ้นจริงที่ไหน?
เนื่องจากนี่เป็นทั้งการออกกำลังกายทางวิชาการซึ่งจะนำไปสู่การดำเนินการดังนั้นการอ้างอิงถึงรูปแบบการออกแบบจะได้รับการชื่นชม