ฉันกำลังทำงานกับแอปพลิเคชันขนาดเล็กที่พยายามเข้าใจหลักการของการออกแบบที่ขับเคลื่อนด้วยโดเมน หากประสบความสำเร็จนี่อาจเป็นโครงการนำร่องสำหรับโครงการขนาดใหญ่ ฉันกำลังพยายามติดตามหนังสือ "ใช้การออกแบบโดเมนขับเคลื่อนด้วย" (โดย Vaughn Vernon) และพยายามใช้ฟอรัมสนทนาที่คล้ายกันและเรียบง่าย ฉันได้ลองดูตัวอย่าง IDDD ของ GitHub ฉันมีปัญหาในการใช้ข้อมูลประจำตัวและการเข้าถึงกรณีของฉัน ให้ฉันให้ข้อมูลพื้นหลัง:
- ฉัน (หวังว่า) เข้าใจเหตุผลที่อยู่เบื้องหลังการแยกผู้ใช้และตรรกะการอนุญาต: มันเป็นโดเมนที่สนับสนุนและเป็นบริบทที่แตกต่างกัน
- ในโดเมนหลักไม่มีผู้ใช้เพียงแค่ผู้สร้างผู้ดูแล ฯลฯ สิ่งเหล่านี้ถูกสร้างขึ้นโดยการเข้าถึงบริบทผู้ใช้และการเข้าถึงโดยใช้บริการจากนั้นจึงแปลวัตถุผู้ใช้ที่ได้รับและผู้ดูแล
การดำเนินการกับโดเมนจะถูกเรียกพร้อมกับบทบาทที่เกี่ยวข้องเป็นพารามิเตอร์: เช่น:
ModeratePost( ..., moderator);
วิธีการของวัตถุโดเมนตรวจสอบว่าอินสแตนซ์ของโมเดอเรเตอร์ที่กำหนดไม่ใช่โมฆะ (อินสแตนซ์ของโมเดอเรเตอร์จะเป็นโมฆะถ้าผู้ใช้ที่ถามจากบริบทผู้ใช้และบริบทไม่มีบทบาทผู้ดูแล)
ในกรณีหนึ่งจะทำการตรวจสอบเพิ่มเติมก่อนที่จะแก้ไขโพสต์:
if (forum.IsModeratedby(moderator))
คำถามของฉันคือ:
ในกรณีหลังความกังวลด้านความปลอดภัยไม่ได้รวมกันอีกครั้งในโดเมนหลัก? ก่อนหน้านี้หนังสือระบุว่า "ใครสามารถโพสต์หัวข้อหรือภายใต้เงื่อนไขที่อนุญาตฟอรั่มเพียงแค่ต้องรู้ว่าผู้แต่งกำลังทำเช่นนั้นในตอนนี้"
การนำไปใช้ตามบทบาทในหนังสือเล่มนี้ค่อนข้างตรงไปตรงมา: เมื่อ Moderator เป็นโดเมนหลักพยายามแปลง userId ปัจจุบันเป็น Moderator หรือเป็นผู้เขียนเมื่อต้องการ บริการจะตอบกลับด้วยอินสแตนซ์ที่เหมาะสมหรือเป็นโมฆะหากผู้ใช้ไม่มีบทบาทที่จำเป็น อย่างไรก็ตามฉันไม่สามารถเห็นได้ว่าฉันจะปรับให้เข้ากับรูปแบบการรักษาความปลอดภัยที่ซับซ้อนมากขึ้นได้อย่างไร โครงการปัจจุบันของเราที่ฉันกำลังดำเนินการอยู่นั้นมีรูปแบบที่ค่อนข้างซับซ้อนกับกลุ่ม ACL ฯลฯ
แม้จะมีกฎที่ไม่ซับซ้อนมากเช่น: "โพสต์ควรแก้ไขโดยเจ้าของหรือบรรณาธิการเท่านั้น" วิธีการนี้ดูเหมือนจะพังหรืออย่างน้อยฉันก็ไม่เห็นวิธีที่ถูกต้องในการนำไปใช้
โดยการถามบริบท Identity and Access สำหรับอินสแตนซ์ OwnerOrEditor รู้สึกไม่ถูกต้องและฉันจะจบลงด้วยคลาสที่เกี่ยวข้องกับความปลอดภัยมากขึ้นในโดเมนหลัก นอกจากนี้ฉันจะต้องผ่านไม่ใช่ userId เท่านั้น แต่ตัวระบุของทรัพยากรที่มีการป้องกัน (id ของโพสต์ฟอรัม ฯลฯ ) ไปยังบริบทความปลอดภัยซึ่งอาจไม่ควรสนใจสิ่งเหล่านี้ (ถูกต้องหรือไม่? )
ด้วยการดึงสิทธิ์ไปยังโดเมนหลักและตรวจสอบพวกเขาในวิธีการของวัตถุโดเมนหรือในบริการฉันจะสิ้นสุดที่ตารางที่หนึ่ง: การผสมความกังวลด้านความปลอดภัยกับโดเมน
ฉันได้อ่านที่ไหนสักแห่ง (และฉันมักจะเห็นด้วยกับมัน) ว่าสิ่งเหล่านี้เกี่ยวข้องกับการอนุญาตไม่ควรเป็นส่วนหนึ่งของโดเมนหลักยกเว้นว่าการรักษาความปลอดภัยและการอนุญาตเป็นโดเมนหลักเอง กฎอย่างง่าย ๆ เช่นเดียวกับที่ระบุไว้ข้างต้นแสดงให้เห็นถึงการรักษาความปลอดภัยเป็นส่วนหนึ่งของโดเมนหลักหรือไม่?
HasPermissionToEdit(userId, resourceId)
แต่ฉันรู้สึกไม่ถูกต้องที่จะปนเปื้อนตรรกะโดเมนด้วยการเรียกเหล่านี้ อาจฉันควรตรวจสอบสิ่งเหล่านี้ในวิธีการบริการแอปพลิเคชันก่อนที่จะเรียกตรรกะโดเมน?
UserService @AccessControlList[inf3rno]
ในคำตอบที่ฉันเชื่อมโยง