เรากำลังพยายามหาวิธีที่ดีที่สุดในการอนุญาตผู้ใช้ในสถาปัตยกรรม microservice ในขณะที่มั่นใจว่า microservices มีสิทธิ์ จำกัด สถาปัตยกรรมของเราใช้บริการการอนุญาตจากส่วนกลางเพื่อจัดการการออกโทเค็น JWT
เรามีข้อกำหนดดังต่อไปนี้:
ผู้ใช้ควรถูก จำกัด ให้ดำเนินบทบาทบางอย่าง เช่นผู้ใช้ควรสามารถสร้าง / แก้ไข / อ่านเนื้อหาที่เขาเป็นเจ้าของได้เท่านั้น
Microservices ควร จำกัด เฉพาะการอนุญาตที่จำเป็นเท่านั้น เช่นบริการไมโครเว็บที่เพียงต้องการอ่านข้อมูลจากบริการอื่นควรถูกห้ามอย่างชัดเจนจากการเขียนข้อมูลไปยังบริการนั้น
ตัวอย่างเช่นสมมติว่าเรามีระบบที่ผู้ใช้สามารถอัปโหลดรูปภาพไปยังบริการเก็บรูปภาพ เรามีบริการติดแท็กที่ติดแท็กรูปภาพด้วยตำแหน่งโดยอัตโนมัติ ผู้ใช้สามารถ CRUD ภาพของตัวเอง บริการติดแท็กสามารถอ่านภาพใด ๆ จากบริการเก็บรูปภาพอย่างไรก็ตามไม่ควรแก้ไข / ลบ
เป็นวิธีที่ดีในการบรรลุเป้าหมายข้างต้นโดยใช้โทเค็น JWT คืออะไร? วิธีแก้ปัญหาบางอย่างที่เรากล่าวถึงคือ:
บริการเก็บรูปภาพแสดง 2 APIs หนึ่งที่พร้อมใช้งานภายนอก (ให้สิทธิ์การเข้าถึง CRUD ผู้ใช้) และอีกหนึ่งที่พร้อมใช้งานภายใน (ให้การเข้าถึงแบบอ่านอย่างเดียวภายใน) ดูเหมือนว่าไม่ยืดหยุ่น - จะเกิดอะไรขึ้นถ้าบริการภายในอื่นต้องการการเข้าถึงเพื่ออ่าน / เขียนภาพทั้งหมด (เช่นภาพที่ลบภาพที่ไม่ชัดเจนโดยอัตโนมัติ)
เราตั้งค่าสองสิทธิ์ใน JWT ของผู้ใช้หนึ่งคือ CRUD_OwnImages ส่วนอีก READ_ForAnalysis บริการติดแท็กสามารถดูว่าผู้ใช้มีสิทธิ์ READ_ForAnalysis หรือไม่และดำเนินการตามคำขอที่เหมาะสมหรือไม่ เรามี microservice อื่นที่ตรวจสอบเพื่อดูว่าผู้ใช้มี CRUD_OwnImages สำหรับการดำเนินการ CRUD ในภาพของผู้ใช้เองหรือไม่ สิ่งนี้ทำให้เกิดความรับผิดชอบในแต่ละไมโครบริการเพื่อให้แน่ใจว่าผู้ใช้ถูก จำกัด การกระทำที่เขาต้องการ ที่เก็บรูปภาพไม่มีวิธี จำกัด microservice แต่ละรายการด้วยวิธีนี้ดังนั้นจึงอาจมีข้อผิดพลาดและเป็นไปได้ง่าย
เราให้บริการการแท็ก microservice ผู้ใช้ของตนเองโดยได้รับอนุญาต READ_ForAnalysis จากนั้นเมื่อบริการติดแท็กร้องขอภาพจากที่เก็บรูปภาพบริการดังกล่าวจะได้รับการเข้าถึง แต่ไม่ได้รับอนุญาตให้แก้ไข ผู้ใช้ของผู้ใช้มีสิทธิ์ CRUD_OwnImages เท่านั้นดังนั้นเขาจึงสามารถดึงและเข้าถึงเฉพาะภาพของเขาจากส่วนหน้า หากบริการอื่นต้องการ CRUD กับข้อมูลทั้งหมดเราสามารถให้ CRUD_AllData หรือที่คล้ายกัน เราชอบวิธีนี้เนื่องจากแต่ละบริการรับผิดชอบข้อมูลของตัวเอง (แทนที่จะใช้ตรรกะนั้นซ้ำซ้อนในหลายบริการ) แต่ถ้าบริการนั้นต้องใช้ทั้งสิทธิ์ผู้ใช้และสิทธิ์ในการให้บริการไมโคร? เราสามารถส่งโทเค็น JWT สองอัน (ทั้งผู้ใช้และบริการไมโคร) ได้อย่างปลอดภัยหรือไม่? มีวิธีการรวมสิทธิ์อย่างปลอดภัยและส่งผ่านหรือไม่ เช่น
ปัญหาจะรุนแรงขึ้นหากต้องการข้อมูลผู้ใช้ดาวน์สตรีมเพิ่มเติม (ห่างจากบริการ 2 หรือ 3 ไมโครวินาที) เราแค่คิดว่ามันขึ้นอยู่กับแต่ละไมโครไซต์ที่จะ จำกัด ตัวเองกับการกระทำที่พวกเขาต้องการและไม่ทำให้ชัดเจน