Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเรียนรู้นโยบายการดำเนินการใน Ruby on Rails:คู่มือปฏิบัติเพื่อการอนุญาตที่ปลอดภัย

เพื่อให้แอปของคุณปลอดภัย คุณต้องควบคุมว่าใครและอะไรสามารถเข้าถึงแอปได้ การควบคุมการเข้าถึงสามารถแบ่งได้เป็นการรับรองความถูกต้อง — "ใคร" ที่จะอนุญาต — และการอนุญาต — "อะไร" ที่พวกเขาสามารถเข้าถึงได้

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

ในซีรีส์สองตอนนี้ เราจะเจาะลึกเกี่ยวกับการใช้ Action Policy gem สำหรับแอปพลิเคชันบล็อก Ruby on Rails

ในส่วนนี้ เราจะกล่าวถึงพื้นฐานของนโยบายการดำเนินการ

มาเริ่มกันเลย!

ข้อกำหนดเบื้องต้น

  • Ruby (เราใช้เวอร์ชัน 3.2.2)
  • ราง (ใช้เวอร์ชัน 7.0.7)
  • ประสบการณ์บางอย่างในการใช้ Ruby

เรามาทำความเข้าใจกันก่อนโดยกำหนดการอนุญาตตามทรัพยากร

การอนุญาตตามทรัพยากรคืออะไร

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

แม้ว่าบทความนี้จะเน้นไปที่การอนุญาตตามทรัพยากร แต่การทราบความแตกต่างระหว่างกลยุทธ์การอนุญาตทั้งสองนี้หมายความว่าคุณมีความพร้อมมากขึ้นที่จะรู้ว่าแต่ละกลยุทธ์สามารถทำอะไรได้บ้าง

เมื่อใดจึงควรใช้การอนุญาตตามบทบาท

คุณควรใช้การอนุญาตตามบทบาทสำหรับ:

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

เมื่อใดจึงควรใช้การอนุญาตตามทรัพยากร

การอนุญาตตามทรัพยากรเหมาะสำหรับ:

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

อย่างไรก็ตาม ไม่ว่าคุณจะเลือกระหว่างการอนุญาตตามบทบาทหรือตามทรัพยากรก็ตาม จะขึ้นอยู่กับคุณลักษณะเฉพาะของแอปพลิเคชันของคุณ

ตอนนี้เรามาดูอัญมณี Action Policy กันดีกว่า

อัญมณีนโยบายการดำเนินการสำหรับ Ruby และ Rails

Action Policy เป็นเฟรมเวิร์กการอนุญาตที่ยืดหยุ่น ขยายได้ และมีประสิทธิภาพสำหรับแอป Ruby และ Rails ใช้กลยุทธ์การแคชหลายแบบตั้งแต่แรกเริ่ม ทำให้รวดเร็วมาก โดยเฉพาะอย่างยิ่งหากกฎการอนุญาตของคุณจำเป็นต้องมีการสืบค้นฐานข้อมูล

คุณสมบัติอีกอย่างที่ทำให้อัญมณีนี้เหมาะสำหรับการสร้างกฎตามทรัพยากรคือความสามารถในการปรับแต่ง มีคลาสและโมดูล Ruby มากมายที่สามารถนำมารวมกันได้หลายวิธี คุณสามารถตั้งกฎการควบคุมการเข้าถึงอย่างละเอียดนอกเหนือจากตัวควบคุม Rails ได้ทุกที่ในแอปของคุณ

ตรวจสอบหน้าแรกของโครงการนโยบายการดำเนินการเพื่อเรียนรู้เพิ่มเติม

ตอนนี้เรามาดูแอป Rails ที่เราจะสร้างในวันนี้กันดีกว่า

สร้างแอป Rails

ในอนาคต เราจะอ้างอิงถึงแอปพลิเคชันบล็อก Rails 7 ที่ผู้ใช้สามารถสร้าง อ่าน อัปเดต และลบโพสต์ (CRUD) ได้

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

ไปข้างหน้าและสร้างแอปพลิเคชัน Rails ใหม่:

 

หมายเหตุ: เราจะใช้สไตล์ Pico CSS สำหรับแอปตัวอย่างของเรา แต่คุณสามารถใช้อะไรก็ได้ตามต้องการ

จากนั้นนั่งร้าน 14 อย่างรวดเร็ว ทรัพยากรที่เราจะใช้ตลอดส่วนที่เหลือของบทช่วยสอน:

 

ตอนนี้ดำเนินการย้ายข้อมูลด้วย 29 .

การตั้งค่าการตรวจสอบสิทธิ์ผู้ใช้

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

การติดตั้งอุปกรณ์

เริ่มต้นด้วยการเพิ่ม Devise gem ให้กับ Gemfile ของคุณ:

 

จากนั้นติดตั้งและสร้าง 37 รุ่น:

 

นอกจากนี้อย่าลืมเพิ่ม 46 ไปยังการกำหนดค่าการพัฒนาของแอป

ขั้นต่อไป ลองใช้บทบาทของผู้ใช้พื้นฐานบางส่วนเพื่อทดสอบสถานการณ์การเข้าถึงของผู้ใช้ที่แตกต่างกันสำหรับ 55 ทรัพยากร

การกำหนดบทบาทผู้ใช้ขั้นพื้นฐาน

ขั้นแรก เพิ่ม 68 คอลัมน์ไปยังตารางผู้ใช้ รันคำสั่งนี้เพื่อสร้างการโยกย้าย:

 

หมายเหตุ: เราใช้ประเภทข้อมูลจำนวนเต็มสำหรับบทบาท ดังนั้นเราจึงสามารถใช้ 78 ได้ — วิธีที่ง่ายและรวดเร็วในการปรับใช้บทบาท

ตอนนี้ดำเนินการย้ายข้อมูลด้วย 82 จากนั้นเปิด 96 สร้างโมเดลและแก้ไข:

 

เมื่อเสร็จแล้ว เรามาเปลี่ยนโฟกัสไปที่การติดตั้ง Action Policy กันดีกว่า

การตั้งค่านโยบายการดำเนินการสำหรับ Ruby และ Rails

เปิด 101 ของแอป และเพิ่มบรรทัดด้านล่าง:

 

จากนั้นรันคำสั่ง 112 เพื่อติดตั้งนโยบายการดำเนินการ

สิ้นสุดการติดตั้งโดยการรัน:

 

นี่ควรให้ฐานแก่เรา — 122 คลาสภายใต้ 134 :

 

นโยบายการใช้งานขั้นพื้นฐานของการดำเนินการ

รากฐานหลักของนโยบายการดำเนินการคือ 144 คลาส 157 ซึ่งคุณสามารถกำหนดการกำหนดค่าส่วนกลางซึ่งนโยบายทั้งหมดสามารถสืบทอดได้ คำแนะนำที่ดีคือวางนโยบายทั้งหมดไว้ภายใต้ 161 และเพื่อแยกนโยบายตามทรัพยากรในแอปของคุณ ตัวอย่างเช่น หากคุณมี 172 ทรัพยากร นโยบายที่เกี่ยวข้องควรเป็น 183 , 195 จะมาพร้อมกับ 204 ทรัพยากร และอื่นๆ

อีกสิ่งหนึ่งที่ควรพิจารณาเมื่อทำงานกับนโยบายการดำเนินการ:คำจำกัดความของกฎต้องเกิดขึ้นภายในวิธีการสาธารณะในคลาสนโยบาย การใช้วิธีส่วนตัวจะทำให้เกิดข้อผิดพลาด

ต่อไป ลองใช้ข้อมูลนี้เพื่อสร้าง 210 โดยเราจะค่อยๆ สร้างการเข้าถึงของผู้ใช้ในระดับต่างๆ

การสร้างนโยบายแรกของเรา

สร้างไฟล์ใหม่ชื่อ 223 ภายใต้ 237 :

 

ที่นี่ เรากำหนดกฎง่ายๆ บน 240 ทรัพยากรที่ประกาศว่าทุกคนสามารถเข้าถึง 254 .

การเชื่อมโยงโพสต์กับผู้ใช้

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

 

จากนั้นเรียกใช้การย้ายข้อมูลด้วย 287 .

ต่อไป เราต้องแก้ไขตัวควบคุมการโพสต์เพื่อรองรับการเปลี่ยนแปลงนี้ ขั้นแรก ให้เพิ่ม 299 ไปที่ 309 ที่อนุญาต :

 

จากนั้นแก้ไข 319 การกระทำ:

 

ต่อไปมารักษาความปลอดภัยของ 320 .

การใช้การอนุญาตในตัวควบคุม

เราจำเป็นต้องแก้ไข 337 พร้อมการโทรกลับเพื่ออนุญาตการเข้าถึงเฉพาะผู้ใช้ที่เข้าสู่ระบบ:

 

ต่อไป ลองใช้นโยบายการโพสต์ใหม่เพื่อเพิ่มการควบคุมการเข้าถึงของผู้ใช้ขั้นพื้นฐาน:

 

ที่นี่ เรากำหนดกฎการเข้าถึงบน 345 ของตัวควบคุมโพสต์ และ 357 การกระทำ เราระบุว่าผู้เขียนโพสต์ (หรือผู้ใช้ที่มีบทบาท "ผู้เขียน") สามารถอัปเดตโพสต์ได้ แต่มีเพียงผู้เขียนโพสต์เท่านั้นที่สามารถลบโพสต์ได้

เคล็ดลับด่วน: นโยบายการดำเนินการสามารถอ้างอิงถึง 363 จัดทำโดย Devise และกำหนดให้กับ 375 ภายในนโยบาย

ต่อไป เราจำเป็นต้องใช้กฎการเข้าถึงในตัวควบคุมโพสต์ดังนี้:

 

เมื่อใช้กฎการเข้าถึงกับตัวควบคุมโพสต์ แนวทางปฏิบัติถัดไปของเราคือเพื่อให้แน่ใจว่าข้อมูลพร็อพเพอร์ตี้ได้รับการปกป้อง

การปกป้องมุมมองด้วยการอนุญาต

ในภาพหน้าจอด้านล่าง ผู้ใช้ที่มีอีเมล 385 และบทบาท "ผู้อ่าน" เข้าสู่ระบบแล้ว อย่างที่คุณเห็น ผู้ใช้รายนี้สามารถดูโพสต์ที่สร้างโดย 398 และพวกเขายังสามารถเข้าถึงลิงก์แก้ไขและลบสำหรับโพสต์นี้ได้ สิ่งนี้ไม่เหมาะ — ลิงก์แก้ไขและลบควรมีให้เฉพาะผู้เขียนโพสต์เท่านั้น

การเรียนรู้นโยบายการดำเนินการใน Ruby on Rails:คู่มือปฏิบัติเพื่อการอนุญาตที่ปลอดภัย

งานแรกของเราคือลบการเข้าถึงลิงก์เหล่านี้สำหรับผู้ใช้ที่ไม่ใช่ผู้เขียนโพสต์ เนื่องจากเราได้กำหนดกฎการเข้าถึงนี้แล้ว เราจึงจำเป็นต้องนำไปใช้กับ 409 เท่านั้น ดูโดยใช้ 419 ที่ดีของ Action Policy วิธีการ:

 

เมื่อใช้กฎนี้ เราสามารถรีเฟรช 428 ของโพสต์ได้แล้ว หน้าและดูว่าเราได้รับอะไร:

การเรียนรู้นโยบายการดำเนินการใน Ruby on Rails:คู่มือปฏิบัติเพื่อการอนุญาตที่ปลอดภัย

ผู้ใช้คนเดียวกันที่มีสิทธิ์เข้าถึงจะถูกจำกัดในสิ่งที่พวกเขาสามารถทำได้ในขณะที่ดูโพสต์

สรุป

ในส่วนแรกของซีรีส์สองส่วนนี้ เราได้เรียนรู้พื้นฐานบางประการเกี่ยวกับนโยบายการดำเนินการอัญมณีการให้สิทธิ์แล้ว

ในส่วนที่สองและส่วนสุดท้าย เราจะสำรวจกรณีการใช้งานขั้นสูงเพิ่มเติมบางส่วน

ขอให้สนุกกับการเขียนโค้ด!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!