การใช้เงื่อนไขด้านความปลอดภัยในมุมมองเป็นการละเมิด MVC หรือไม่


10

บ่อยครั้งที่สิ่งที่ปรากฏต่อผู้ใช้ (เช่นบนหน้าเว็บ) จะขึ้นอยู่กับการตรวจสอบความปลอดภัยเป็นส่วนหนึ่ง ฉันมักจะพิจารณาความปลอดภัยระดับผู้ใช้ / ACL เป็นส่วนหนึ่งของตรรกะทางธุรกิจของระบบ หากมุมมองตรวจสอบความปลอดภัยอย่างชัดเจนเพื่อแสดงองค์ประกอบ UI แบบมีเงื่อนไขจะเป็นการละเมิด MVC โดยมีตรรกะทางธุรกิจหรือไม่


สิ่งที่จะเป็นทางเลือก?

1
คุณสามารถใช้สิ่งที่จะช่วยให้คุณรักษาความปลอดภัยที่ดีที่สุดแม้จะถือว่าเป็นต่อต้านรูปแบบโดยบางส่วน
zxcdw

คำตอบ:


6

เงื่อนไขการรักษาความปลอดภัยสามารถมีได้สองประเภทหนึ่งแบบในแบบจำลองและแบบอื่นในมุมมอง มุมมองจะควบคุมการแสดงองค์ประกอบที่เกี่ยวข้องโดยขึ้นอยู่กับการอนุญาตของผู้ใช้ปัจจุบัน แต่ตัวแบบควบคุมการเข้าถึงข้อมูลพื้นฐาน ตราบใดที่โมเดลมีการตรวจสอบ / การตรวจสอบที่ถูกต้องทั้งหมดแม้ว่ามุมมองจะขาด แต่ก็ยังมีความปลอดภัย

โดยปกติคุณจะต้องมีทั้งคู่เนื่องจากมุมมองจำเป็นต้องเปลี่ยนสำหรับระดับ / บทบาทที่แตกต่างกัน คอนโทรลเลอร์ส่งข้อมูลที่เกี่ยวข้องซึ่งจะเปลี่ยนมุมมอง แต่มุมมองยังคงต้องทำอะไรกับข้อมูลนั้นเพื่อซ่อน / แสดงเนื้อหาให้กับผู้ใช้ที่เหมาะสม

นั่นเป็นสาเหตุที่เฟรมเวิร์กการสร้างเทมเพลตส่วนใหญ่มีองค์ประกอบตามเงื่อนไข ( ตัวอย่างเช่นแถบแฮนด์ ):

{{#if isCurrentUserAdmin}}
    ....
{{/if}

นั่นหมายความว่าไม่ใช่การละเมิดตราบใดที่ชิ้นส่วนที่เหมาะสมอยู่ในตำแหน่งที่ถูกต้อง


4

ใช่และไม่.

หากมุมมองการตัดสินใจด้านความปลอดภัยเกิดขึ้นจริงใช่คุณกำลังละเมิด MVC อย่างไรก็ตามหากมุมมองมอบหมายการตัดสินใจที่แท้จริงให้กับแบบจำลองแสดงว่าคุณไม่เป็นไร ไม่มีอะไรผิดปกติกับมุมมองในการตัดสินใจว่าองค์ประกอบใดที่จะแสดงตามข้อมูลจากแบบจำลอง

ตัวอย่างเช่นหากคุณมีปุ่ม "แก้ไข" ที่ปรากฏให้ผู้ใช้ที่มีสิทธิ์ "แก้ไข" เท่านั้นก็จะดีสำหรับมุมมองที่จะถามรูปแบบที่ผู้ใช้ปัจจุบันและว่าพวกเขามีสิทธิ์ "แก้ไข" แล้ว ใช้ข้อมูลนี้เพื่อตัดสินใจว่าจะแสดงปุ่มหรือไม่ อย่างไรก็ตามหากมุมมองนั้นต้องใช้การพิสูจน์ตัวตนและตรรกะการอนุญาตเองคุณก็จะละเมิด MVC


2

ผมจะบอกว่าไม่มี

แต่ด้วยเหตุผลที่แตกต่างจาก @rvcoutinho พูด (แม้ว่าเขาอ้างวิกิพีเดียซึ่งทำให้ฉันรู้สึกผิดในความคิดของฉัน)

ฉันจะบอกว่าความกังวลด้านความปลอดภัยที่เกี่ยวข้องใด ๆ ควรแบ่งปันโดย Model ที่ให้ไว้กับมุมมอง (ขึ้นอยู่กับจำนวนชุดค่าผสมที่คุณอาจต้องการใช้ ViewModel ด้วยเหตุผลนี้) ซึ่งคุณสามารถมีสวิตช์สำหรับบิตความปลอดภัยได้

สิ่งนี้ช่วยให้การตรวจสอบความปลอดภัยของเลเยอร์สอง: ที่เลเยอร์ UI ดังนั้นการ postback จะล้มเหลวสำหรับกรณีปกติเช่นเดียวกับที่เลเยอร์เซิร์ฟเวอร์สำหรับนักแสดงที่ไม่ดีที่โมเดลรักษาความรู้ด้านความปลอดภัยภายในตัวเอง รูปแบบที่โยนมันออกไปทันที

การรักษาความปลอดภัยสองชั้นเช่นนี้เป็นมาตรฐานในอุตสาหกรรมและวิธีนี้ช่วยให้ตรรกะความปลอดภัยของคุณจำเป็นต้องมีอยู่ในสองสถานที่ดังนั้นจึงเป็นโบนัสทันทีที่คุณใส่ตรรกะความปลอดภัยในตัวควบคุมของคุณคุณวางไว้ที่นั่นและ UI และในโมเดล (โมเดลต้องการเนื่องจากเป็นบรรทัดสุดท้ายของการป้องกันและสำคัญอย่างยิ่งสำหรับการใช้งานใด ๆ นอกเหนือจากเว็บแอป MVC เช่นไคลเอนต์เดสก์ท็อปหรือเครื่องมือการจัดการเซิร์ฟเวอร์)


การยืนยันของวิกิพีเดียว่า"ผู้ควบคุมสามารถส่งคำสั่งไปยังมุมมองที่เกี่ยวข้องเพื่อเปลี่ยนการนำเสนอมุมมองของแบบจำลอง"ดูเหมือนจะเหมาะสมกว่ากับModel-View-Presenterเนื่องจากรูปแบบการโต้ตอบวลีที่ดูเหมือนจะอธิบายมีความเป็นไปได้ การแสดงผลมุมมองจะไม่มีการดำเนินการใด ๆ เกิดขึ้นระหว่างมุมมองและตัวควบคุม
Robert Harvey

1
@ RobertHarvey ฉันจะเห็นด้วยว่าแถลงการณ์ไม่เหมาะกับคำจำกัดความของ MVC ของฉัน แต่โชคดีที่เราทำงานในอุตสาหกรรมที่ความถูกต้องถูกตัดสินโดยส่วนใหญ่ของข้อตกลงมากกว่าข้อพิสูจน์ใด ๆ เพราะคำจำกัดความเหล่านี้ลอยขึ้นราวกับว่าจากอีเธอร์ด้วย รากฐานที่พัฒนาอย่างต่อเนื่องช่วยให้ทุกคนสามารถทำสิ่งที่เป็นของตัวเอง หรือพูดง่ายๆก็คือฉันอาจผิดเหมือนคนอื่น ๆ ที่นี่
จิมมี่ฮอฟฟา

3
นี่คือเหตุผลที่ฉันคิดว่าผู้คนมีความเชียวชาญเกี่ยวกับเรื่องแบบนี้อยู่ดี
Robert Harvey

1
@rvcoutinho ฉันจะไม่พูดอย่างนั้นเลย คุณได้รับการอ้างอิงในด้านของคุณทั้งหมดที่ฉันได้รับคือความเห็นของฉันดังนั้นในใจของฉันซึ่งหมายความว่าฉันน่าจะผิดซึ่งเป็นสาเหตุที่ฉันพูดถึงมัน ฉันรู้สึกว่าความคิดเห็นของฉันน่าเชื่อถือพอที่จะแบ่งปันได้แม้ว่าฉันจะไม่มีการอ้างอิงดังนั้นฉันก็ทำต่อไปโดยไม่คำนึงถึงข้อเท็จจริงที่ว่าฉันพูดว่าฉันน่าจะผิด
จิมมี่ฮอฟฟา

1
@rvcoutinho: อันที่จริงฉันหมายถึงคำถามของ OP :) ไม่มีอะไรผิดปกติกับกฎเว้นแต่ว่ากฎได้รับในทางที่จะทำอะไรบางอย่าง
Robert Harvey

2

ผมจะบอกว่าไม่มี

โดยปกติแล้วการตรวจสอบความปลอดภัยประเภทนี้จะดำเนินการโดยผู้ควบคุม

จากวิกิพีเดีย :

คอนโทรลเลอร์สามารถส่งคำสั่งไปยังมุมมองที่เกี่ยวข้องเพื่อเปลี่ยนการนำเสนอมุมมองของโมเดล

และฉันไม่คิดว่ามันควรจะทำโดยตรงในมุมมอง หากทำผ่าน javascript อาจเป็นปัญหาด้านความปลอดภัย (สามารถปิดใช้งาน javascript และเข้าถึงข้อมูลที่มีสิทธิพิเศษ)

อีกครั้งจากWikipedia :

มุมมองการร้องขอจากแบบจำลองข้อมูลที่จะต้องมีการสร้างตัวแทนการส่งออก


1
ในระบบซอฟต์แวร์จำนวนมากการแสดงองค์ประกอบขึ้นอยู่กับระดับความปลอดภัยของผู้ใช้ ในขณะที่คุณสามารถยับยั้งการแสดงรายการข้อมูลโดยตั้งเป็นศูนย์หรือโมฆะในมุมมองแบบจำลองชื่อหรือคำอธิบายของรายการข้อมูลจะยังคงปรากฏ ที่เดียวที่คุณสามารถยับยั้งการแสดงคำอธิบายรายการข้อมูล (ในทางปฏิบัติ) อยู่ในมุมมอง
Robert Harvey

ฉันมักจะไม่เห็นด้วย ฉันจะบอกว่ามุมมองจะขอข้อมูลผู้ควบคุมจะจัดการกับโมเดลและมุมมองจะเป็นตัวแทนของมันอีกครั้ง มุมมองควรมีความรับผิดชอบในการเป็นตัวแทนของการส่งออกเท่านั้น
rvcoutinho

นี่คือเหตุผลที่ View จำเป็นต้องซ่อนองค์ประกอบภาพเหล่านั้นซึ่งผู้ใช้ไม่จำเป็นต้องเห็น คอนโทรลเลอร์ไม่รับผิดชอบในการสร้างการแสดงภาพข้อมูล มุมมองคือ แน่นอนหากสิ่งที่คุณแสดงมีความละเอียดอ่อนจนไม่สามารถอยู่ใน View / Source ได้สิ่งที่คอนโทรลเลอร์ต้องทำคือส่งคืนมุมมองที่ต่างออกไป
Robert Harvey

1
นั่นคือประเด็นของฉัน มุมมองควรแตกต่างกัน เท่าที่ฉันเข้าใจดูเหมือนว่ามุมมองควรดูแลการแสดงข้อมูลเท่านั้น โดยการเป็นตัวแทนฉันจะหมายถึงวิธีการแสดงบางสิ่งบางอย่างไม่ให้แสดงเมื่อใด แต่ความคิดเห็นของคุณมีความเกี่ยวข้องโดยสิ้นเชิง
rvcoutinho

ฉันคิดว่าเราอาจใช้การแสดงออกเดียวกันกับสองสิ่งที่แตกต่างกัน อะไรคือมุมมองที่แตกต่าง แต่ฉันคิดว่าเราเห็นด้วยกับเรื่องที่สำคัญที่สุด: ถ้ามันไวต่อความปลอดภัยมันไม่ควรถูกจัดการโดยมุมมอง
rvcoutinho

1

มีหลายประเด็นที่เกี่ยวข้องกับคำถามนี้

  1. การตรวจสอบความถูกต้อง (คือผู้ใช้นี้ที่เขาบอกว่าเป็น) ไม่ควรเป็นกังวลเกี่ยวกับมุมมอง
  2. การอนุญาต (เป็นผู้ใช้ปัจจุบันที่ได้รับอนุญาตให้ทำสิ่งนี้ ) เป็นข้อกังวลของมุมมองเพราะอาจส่งผลต่อสิ่งที่ได้รับการนำเสนอให้กับผู้ใช้ if model.userCanEdit() ... endifดังนั้นรหัสสำหรับการแสดงแก้ไขปุ่มสามารถถูกล้อมรอบด้วยเช่นเงื่อนไข
  3. การพิจารณาว่าผู้ใช้มีคุณสมบัติการอนุญาตใดนั่นคือตรรกะทางธุรกิจและควรอยู่ในรูปแบบ (ตัวอย่างเช่นสิทธิ์ 'แก้ไข' กำหนดให้คุณต้องมี 2000 ชื่อเสียงหรือว่าคุณต้องเป็นผู้แต่งหรือผู้ดำเนินรายการ)

0

หากเป็นเพียงการแสดงองค์ประกอบ UI ฉันคิดว่าไม่เป็นไร (คุณจะทำยังไงต่อไป?) หากจะมีข้อมูลใด ๆ ในองค์ประกอบเหล่านั้นแบบจำลองควรทำให้แน่ใจว่าภาชนะนั้นว่างเปล่า และแน่นอนว่าต้องมีการจัดการโค้ดเพื่อรับข้อมูลการอนุญาตก่อนการดูดังนั้นจึงไม่มีการเข้าถึงโมเดลที่นี่


0

หากมุมมองตรวจสอบความปลอดภัยอย่างชัดเจนเพื่อแสดงองค์ประกอบ UI แบบมีเงื่อนไขจะเป็นการละเมิด MVC โดยมีตรรกะทางธุรกิจหรือไม่

ใช่เป็นการละเมิด MVC

มุมมองอยู่ที่นั่นเพียงเพื่อแสดงองค์ประกอบและตรรกะควรอยู่ในรูปแบบ โดยให้มุมมองทำอะไร (ในกรณีของคุณตรวจสอบความปลอดภัย) คุณกำลังวางตรรกะที่นั่น


จากนั้นมุมมองจะรู้ได้อย่างไรว่าจะแสดงบางอย่างเช่นปุ่มแก้ไขหรือไม่
Matt S

@MattS ผู้นำเสนอเรียกใช้ฟังก์ชันในมุมมองเพื่อแสดงหรือซ่อนปุ่มนั้น (ขึ้นอยู่กับสถานะในรุ่น)
BЈовић
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.