2017-02-13 79 views
1

我正在使用Loopback3。我遇到了ACL角色的问题,我不确定我做错了什么。我希望特定角色的用户能够将数据写入端点,并且出于某种原因,我设置的用户(位于其中一个角色中)无法写入。我得到一个需要授权的错误。环回ACL“需要授权”

我有4个角色:

  • 管理
  • 内部
  • 外部
  • 机器人

对于这个端点,所有授权用户可以读取数据,但只有管理员,内部和bot用户可以写入数据,并且只有管理员用户可以删除数据。

下面是我有我的ACL定义:

"acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "READ", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "internal", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "bot", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "DELETE", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW" 
    } 
], 

我有两个用户设置,一个是机器人,而另一个是管理员。当我为任何用户对API执行POST请求时,即使从浏览器界面进行操作,我也会得到'需要授权'错误。我可以做一个没有问题的GET,但是POST会失败。

如果我删除所有的“WRITE”ACL,并用它替换它们,做一个POST的作品。

{ 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 

所以,我可以做到这一点,但我不知道为什么我的自定义角色是失败。

编辑:这是我创建用户的方式,因为我实际上没有任何类型的界面。

module.exports = function (app) { 
    let today = new Date(); 

    let admin = { 
     name: 'admin', 
     description: 'admin users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let internal = { 
     name: 'internal', 
     description: 'Internal users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let external = { 
     name: 'external', 
     description: 'external users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let bot = { 
     name: 'bot', 
     description: 'robots', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let model = app.models.user; 

    model.create([ 
     {username: 'bot', email: '[email protected]', password: 'test123'}, 
     {username: 'admin', email: '[email protected]', password: 'test123'}, 
     {username: 'iAdmin', email: '[email protected]', password: 'test123'}, 
     {username: 'eUser', email: '[email protected]', password: 'test123'}, 
    ], function(err, users) { 
     if (err) throw err; 

     app.models.Role.create(bot, function (err, botRole) { 
      if (err) throw err; 

      botRole.principals.create({principalType: app.models.RoleMapping.user, principalID: users[0].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(admin, function (err, adminRole) { 
      if (err) throw err; 

      adminRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[1].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(admin, function (err, internalRole) { 
      if (err) throw err; 

      internalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[2].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(external, function (err, externalRole) { 
      if (err) throw err; 

      externalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[3].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 
    }); 
}; 
+0

问题可能出在您创建角色并将其关联到用户的位置。 –

+0

可能地,我已经添加了用于首先创建用户的脚本。 – Lisa

+0

我相信他们应该是'app.models.RoleMapping.USER'而不是'app.models.RoleMapping.user' –

回答

1

的主要问题,我正经历着围绕以下项目:

  1. 使用app.models.RoleMapping.USER代替app.models.RoleMapping.user(这是在代码库改变早期)

  2. 使用principalId代替principalID

由于ACL的其他部分由于它们不工作而已从应用程序中删除,因此我无法说明它们是否也是导致问题的原因,但我会随着时间的推移添加它们,以确保使用LB3的正确权限。

0

有角色和动态角色/状态($大家和$身份验证)之间的差异,而你的角色获得存储在一个表,以保持与用户$每个人的关联和$认证只是一种状态的用户。看看名为“RoleMapping”的表,如果这是正确的。另外,如果您有自定义角色,请创建一个自定义RoleResolver。

实在是好的文档,真的没有那么难在环回3

https://loopback.io/doc/en/lb3/Defining-and-using-roles.html

这个例子给我的角色非常了解一般上手:

https://github.com/strongloop/loopback-example-access-control/blob/master/server/boot/role-resolver.js

这是一个完整的项目,所以你可以看看那里的模型。

0

这是你的两个表应该如何看起来像:

GET role -->> [table - role] 

[ 
    { 
    "roleId": 1, 
    "name": "admin", 
    "description": "admin", 
    "created": "2016-08-23T16:46:07.572Z", 
    "modified": "2016-08-23T16:46:07.572Z" 
    }, 
    { 
    "roleId": 2, 
    "name": "internal", 
    "description": "internal", 
    "created": "2016-08-23T16:46:07.574Z", 
    "modified": "2016-08-23T16:46:07.574Z" 
    } 
] 


Get Role Mapping [table- user-role]-->> 

[ 
    { 
    "userRoleId": 123, 
    "roleId": 2, //id of role i.e. 1 for admin 
    "principalType": "USER", 
    "principalId": "1234", 
    "created": null, 
    "modified": null 
    }, 
    .. 
    ... 
] 

所以通过看你的代码,我可以说,你是不是添加角色ID为roleMapping表。

首先添加的所有角色中的角色表,

现在创建用户和角色映射表中添加该用户的输入和一个角色ID分配给它,看到上面的代码中角色ID 1表示管理员角色。

+0

我的RoleMapping表填充了roleId字段,但是其中的principalId字段不是。 – Lisa

0

其实,你的代码有一些语法和逻辑错误!

  1. app.models.RoleMapping.USER而不是app.models.RoleMapping.user(@Farid表示)。
  2. loopback acl中没有“DELETE”acceessType。 accesType值应该使用“*”,“READ”,“WRITE”或“EXECUTE”。 “WRITE”支持“创建”,“updateAttributes”,“upsert”和“destroyById”资源。 (更多详情,请参阅loopback documentation)。

更改ACL这样下面的代码:

"acls": [ { "accessType": "*", "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" }, { "accessType": "READ", "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW" }, { "accessType": "*", "principalType": "ROLE", "principalId": "admin", "permission": "ALLOW" }, { "principalType": "ROLE", "principalId": "internal", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] }, { "principalType": "ROLE", "principalId": "bot", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] } ]

  1. 最后,确保正确执行角色和roleMapping。