Loopback提供了出色的“级别” ACL,用于限制对整个模型或其MEHOD的访问,但极大地缺乏将单个对象访问的能力。该项目试图通过在每个对象上设置对象级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" ]
}
}
}混合物将解析要像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”的用户访问此对象,而没有其他人。检索时,混合物将再次解析物体的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" ]
}
}
}正如您可能猜到的那样,现在可以通过用户对象上的acl_groups中指定的group-id-1来访问此对象。
如果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" ]
}
}
}如果您在模型上安装了混合蛋白,但在创建新对象时未指定$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到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期望options对象上的currentUser对象。这不是默认的循环v3.x行为,必须在使用之前实现。
可以在此处找到实施:http://loopback.io//doc/en/lb3/ususe-current-context.html#use-a-custom-strong-remoting-phase-phase-phase
此Mixin仅通过Loopback v3.x进行测试,并将MongoDB用作DataSource
2.0版