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

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

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