如何在环回中正确设置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已经是很好,这些都是你需要采取的步骤:

  1. 删除admin.jsonadmin.js因为你并不需要一个实体来处理资源的授权。
  2. 创建一个脚本,创建角色admin,如果它还不存在。
  3. 创建一个脚本,它将用户标识作为参数并将角色admin赋予给定的用户。