Loopback ให้ ACL "ระดับระดับ" ที่ยอดเยี่ยมสำหรับการ จำกัด การเข้าถึงแบบจำลองทั้งหมดหรือ mehods แต่ขาดความสามารถในการ จำกัด การเข้าถึงวัตถุแต่ละรายการอย่างมาก โครงการนี้พยายามที่จะแก้ปัญหานี้โดยการตั้งค่า ACL ระดับวัตถุในแต่ละวัตถุและจัดการการสืบค้นของ Loopback เพื่อส่งคืนวัตถุที่ผู้ใช้ที่ร้องขอให้เข้าถึงเท่านั้น
Circleci:
สมมติว่าเราต้องการหนังสือเล่มเดียวเท่านั้นที่จะอ่านได้
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Mixin จะแยกวิเคราะห์วัตถุที่จะเก็บไว้ใน Mongo:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}ตอนนี้วัตถุนี้สามารถเข้าถึงได้โดยผู้ใช้ที่มี ID ของ "AAA", "BBB" หรือ "CCC" และไม่มีใครอื่น เมื่อเรียกคืน MixIn จะแยกวิเคราะห์ ACL ของวัตถุกลับมาอีกครั้ง:
GET /api/books/123
authorization: accessToken-aaa
ผลตอบแทน:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}ในขณะที่การร้องขอโดยไม่ได้รับอนุญาตนำไปสู่:
GET /api/books/123
authorization: accessToken-ddd
ผลตอบแทน:
404 Not found
ในการระบุผู้ใช้ทุกคนที่จะสามารถเข้าถึงวัตถุอาจเป็นเรื่องยุ่งยากและ timeconsuming นี่คือที่กลุ่มมีประโยชน์
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} ตามที่คุณอาจเดาได้ว่าวัตถุนี้สามารถเข้าถึงได้โดยผู้ใช้ที่มี group-id-1 ที่ระบุไว้ใน acl_groups บนวัตถุผู้ใช้
หาก user-id-1 และ user-id-2 ไม่ได้อยู่ใน group-id-1 ผู้ใช้เหล่านี้สามารถเข้าถึงได้อย่างชัดเจนด้วยวิธีนี้:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ] ,
"users" : [ "user-id-1" , "user-id-2" ]
}
}
} หากคุณติดตั้ง MixIn ในโมเดลของคุณแล้ว แต่คุณไม่ได้ระบุ $acl ในการสร้างวัตถุใหม่การมองเห็นวัตถุจะเป็นสาธารณะเช่น:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}ผลตอบแทน
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "*" ] ,
"users" : [ "*" ]
} ,
"w_perm" : {
"groups" : [ "*" ] ,
"users" : [ "*" ]
}
}
} npm install --save loopback-object-acl
ใน model-config.json เพิ่ม ../node_modules/loopback-object-acl node_modules/loopback-object-acl เพื่อ mixins
"_meta" : {
"sources" : [
"loopback/common/models" ,
"loopback/server/models" ,
"../common/models" ,
"./models"
] ,
"mixins" : [
"loopback/common/mixins" ,
"loopback/server/mixins" ,
"../common/mixins" ,
"./mixins" ,
"../node_modules/loopback-object-acl"
]
} ตั้งค่า ObjectAclController เกี่ยวกับสิ่งที่คุณต้องการปกป้องด้วย ACL ระดับวัตถุ:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Mixins นี้คาดว่าจะมีวัตถุ currentUser บนวัตถุ options นี่ ไม่ใช่ พฤติกรรม Loopback V3.x เริ่มต้นและต้องดำเนินการก่อนการใช้งาน
การใช้งานสามารถพบได้ที่นี่: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-strong-remoting-phase
mixin นี้ได้รับการทดสอบด้วย loopback v3.x และการใช้ MongoDB เป็นแหล่งข้อมูล
เวอร์ชัน 2.0