ฉันกำลังดูที่การออกแบบส่วนต่อประสานของฉันและฉันพยายามที่จะตัดสินใจว่าวิธีใดที่ "ถูกต้อง" ที่สุดในการใช้การควบคุมการเข้าถึงตามบทบาทซึ่งกำหนดไว้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()
การจัดการควบคุมการเข้าถึงโดยมีข้อยกเว้นเมื่อผู้ใช้ไม่ได้รับอนุญาตที่จำเป็น?
"แนวปฏิบัติที่ดีที่สุด" ในสถานการณ์นี้คืออะไร? ความรับผิดชอบในการตรวจสอบเกิดขึ้นจริงที่ไหน?
เนื่องจากนี่เป็นทั้งการออกกำลังกายทางวิชาการซึ่งจะนำไปสู่การดำเนินการดังนั้นการอ้างอิงถึงรูปแบบการออกแบบจะได้รับการชื่นชม