如何在环回中正确设置ACL
问题描述:
我在回环中遇到了acl问题。 我能够正确地在数据库中创建Role和RoleMapping集合。 问题是,当管理员尝试创建一个新的产品,它说未经授权。有人能指导我做错了什么,或者指导我做正确的做法。如何在环回中正确设置ACL
project.json
{
"name": "product",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {},
"validations": [],
"relations": {
"admin": {
"type": "belongsTo",
"model": "admin",
"foreignKey": ""
}
},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW",
"property": "create"
}
],
"methods": {}
}
admin.json
{
"name": "admin",
"base": "User",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {},
"validations": [],
"relations": {
"products": {
"type": "hasMany",
"model": "product",
"foreignKey": ""
}
},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
}
],
"methods": {}
}
admin.js
'use strict';
module.exports = function(Admin) {
Admin.afterRemote('create', function(context, user, next) {
Admin.app.models.Role.upsertWithWhere({
name: 'admin'
},{name:'admin'}, function(err, role) {
if (err) throw err;
console.log('Created role:', role);
role.principals.create({
principalType: Admin.app.models.RoleMapping.ROLE,
principalId: user.id
}, function(err, principal) {
if (err) throw err;
console.log('Created principal:', principal);
});
});
next();
});
};
答
环回文档ACL的管理是很清楚,从http://loopback.io/doc/en/lb3/Defining-and-using-roles.html#static-roles
Role.create({
name: 'admin'
}, function(err, role) {
if (err) cb(err);
role.principals.create({
principalType: RoleMapping.USER,
principalId: <USER_ID>
}, function(err, principal) {
cb(err);
});
});
的静态角色admin
的示例采用内存作为主存储和需要每次开机要执行的代码。如果您使用的是持久性数据库,则只需要创建一次管理角色,然后就可以将admin角色分配给用户。
project.json
ACL已经是很好,这些都是你需要采取的步骤:
- 删除
admin.json
和admin.js
因为你并不需要一个实体来处理资源的授权。 - 创建一个脚本,创建角色
admin
,如果它还不存在。 - 创建一个脚本,它将用户标识作为参数并将角色
admin
赋予给定的用户。