يوفر Loopback "ACL" على مستوى الفصل لتقييد الوصول إلى نموذج كامل أو Mehods ، ولكنه يفتقر إلى حد كبير إلى القدرة على تقوية الوصول إلى الكائنات الفردية. يحاول هذا المشروع حل هذا ، من خلال تعيين ACL على مستوى الكائن على كل كائن ، ويعالج استعلام Loopback لإرجاع الكائنات فقط التي يمكن للمستخدم المطلب الوصول إليها.
Circleci:
دعنا نقول أننا نريد أن نكون قابلاً للقراءة (المقصود من التورية) من قِبل 3 مستخدمين (ID: "AAA" ، ID: "BBB" و ID: "CCC"):
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 : [ ]
}
}لا يمكن الوصول إلى هذا الكائن إلا من قبل مستخدم فقط مع معرف "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
لتحديد كل مستخدم يمكنه الوصول إلى الكائن يمكن أن يكون مرهقًا ومستهلكًا. هذا هو المكان الذي تأتي فيه المجموعات في متناول يدي.
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 Add ../node_modules/loopback-object-acl to 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 . هذا ليس سلوكًا افتراضيًا لرباه V3.x ، ويجب تنفيذه قبل الاستخدام.
يمكن العثور على التنفيذ هنا: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-remoting-day
يتم اختبار هذا mixin فقط باستخدام Loopback V3.x واستخدام MongoDB كرد بيانات
الإصدار 2.0