การอนุญาตผู้ใช้ Django Inlines + ดูอย่างเดียว - ปัญหาการอนุญาต

ฉันไม่แน่ใจว่านี่เป็นข้อบกพร่องหรือฉันแค่ขาดอะไรบางอย่าง (แม้ว่าฉันจะแยกวิเคราะห์เอกสารเกี่ยวกับอินไลน์แล้วก็ตาม) แต่:

สมมติว่าฉันมีโมเดล A โมเดล A เป็นแบบอินไลน์ของโมเดล B ผู้ใช้ U มีสิทธิ์เข้าถึงโมเดล B เต็มรูปแบบ แต่จะเปลี่ยนแปลงเฉพาะการอนุญาตโมเดล A เท่านั้น (ดังนั้น ห้ามเพิ่มหรือลบ)

อย่างไรก็ตาม เมื่อแก้ไขโมเดล B ผู้ใช้ U ยังคงเห็นลิงก์ "เพิ่ม A อื่น" ที่ด้านล่าง แม้ว่า U จะไม่เพิ่มสิทธิ์สำหรับโมเดลนั้นก็ตาม

เกิดอะไรขึ้น? ทำไมลิงค์นั้นถึงแสดงต่อไป? ตรรกะของฉันบอกว่าหาก U ไม่มีสิทธิ์ในการเพิ่ม A ลิงก์ก็ไม่ควรปรากฏอีกต่อไป

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

ตอนนี้ฉันกำลังพยายามจำลอง 'สิทธิ์ดูอย่างเดียว' โดยปล่อยให้ U มีสิทธิ์เปลี่ยนและตั้งค่าฟิลด์ทั้งหมดเป็นแบบอ่านอย่างเดียว แต่ฉันคิดว่านี่เป็นแนวทางที่โง่เขลาและอาจทำให้เกิดปัญหาเช่นการอนุญาตข้างต้น...

โปรแกรมเมอร์ Django โดยเฉลี่ยอย่างฉันจะได้รับสิทธิ์ในการดูอย่างเดียวได้อย่างไร และที่สำคัญที่สุด ฉันจะกำจัดลิงก์ "เพิ่มอีก A" ที่ด้านล่างของแบบฟอร์มแก้ไขของผู้ดูแลระบบได้อย่างไร

ขอบคุณล่วงหน้า!


person Vali    schedule 18.05.2010    source แหล่งที่มา
comment
คำถามใหญ่ที่นี่: คุณจะกำหนดผู้ใช้รายนี้ได้อย่างไร X มีสิทธิ์เข้าถึงวัตถุ Y แบบอ่านอย่างเดียว เฟรมเวิร์ก Perms นั้นเป็นฐานที่คุณควรเขียนโค้ดของคุณเองเพื่อตรวจสอบและตรวจสอบการกระทำของผู้ใช้ในอ็อบเจ็กต์บางอย่าง อ่านเครื่องมือตกแต่ง [permission_required][1] เพื่อเรียนรู้เพิ่มเติม ผู้ดูแลระบบเองจะไม่เดาอย่างน่าอัศจรรย์ว่าผู้ใช้ X ไม่สามารถสร้างวัตถุ Y ได้ และต่อมาจึงลบตัวเลือกเพิ่ม Y [1]: docs.djangoproject.com /en/1.2/topics/auth/   -  person dguaraglia    schedule 04.06.2010
comment
การอ่านคำถามจะง่ายกว่าถ้าคุณมีโมเดลตัวอย่างและคลาส modeladmin   -  person Skylar Saveland    schedule 26.06.2010


คำตอบ (1)


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

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

วิธีเดียวที่ฉันเห็นว่าคุณสามารถควบคุมผู้ดูแลระบบได้มากขนาดนี้คือการไม่อินไลน์ A

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

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

อย่างไรก็ตาม เมื่อข้อกำหนดในการควบคุมการเข้าถึงมีความละเอียดมาก โซลูชันทั่วไป (เช่น django.contrib) ก็ไม่น่าเป็นไปได้

person Mike DeSimone    schedule 22.06.2010