如何在运行时为所有模型添加ACL规则?

时间:2016-02-12 12:43:06

标签: node.js loopbackjs strongloop

我正在尝试在运行时为所有模型创建acl规则。 我的表单包含ACL信息,如:

id, 
model name,
property,
accesstype,
principalId, (here I am assign roldId from role table).
PrincipalType.

提交表单后,信息将存储在ACL表(DB:mysql)中。我的问题是如何在mixin或boot scritpt中获取数据,以及何时从acl表获取acl数据以及如何在运行时分配给所有模型。

我在mixin和boot脚本中尝试过但我无法理解。

在mixin文件中,如何获取acl数据以及如何为所有模型提供帮助..

我真的很困惑因为我不会在运行时为所有模型推送acl数据(比如boot,mixin,operation hook)。

请提出任何想法。

我想要,在mixin或启动脚本或任何。

从acl获取所有数据并分配给所有模型。

In mixin.// I don't know how to get acl data from database in mixin files. 
ACL.find(function(err, data)
{
    var acl = data;
});

// doing some iteration..

 Model.settings.acls.push(data);

1 个答案:

答案 0 :(得分:0)

默认情况下,ACL(基类)在运行时收集并连接静态JSON acl规则和ACL表数据,因此它将自动运行。

  

从Model.JSON ex获取静态ACL:user.json

ACL.getStaticACLs = function getStaticACLs(model, property) {
var modelClass = loopback.findModel(model);
var staticACLs = [];
if (modelClass && modelClass.settings.acls) {
  modelClass.settings.acls.forEach(function(acl) {
    var prop = acl.property;
    // We support static ACL property with array of string values.
    if (Array.isArray(prop) && prop.indexOf(property) >= 0)
      prop = property;
    if (!prop || prop === ACL.ALL || property === prop) {
      staticACLs.push(new ACL({
        model: model,
        property: prop || ACL.ALL,
        principalType: acl.principalType,
        principalId: acl.principalId, // TODO: Should it be a name?
        accessType: acl.accessType || ACL.ALL,
        permission: acl.permission
      }));
    }
  });
}
var prop = modelClass && (
  // regular property
  modelClass.definition.properties[property] ||
  // relation/scope
  (modelClass._scopeMeta && modelClass._scopeMeta[property]) ||
  // static method
  modelClass[property] ||
  // prototype method
  modelClass.prototype[property]);
if (prop && prop.acls) {
  prop.acls.forEach(function(acl) {
    staticACLs.push(new ACL({
      model: modelClass.modelName,
      property: property,
      principalType: acl.principalType,
      principalId: acl.principalId,
      accessType: acl.accessType,
      permission: acl.permission
    }));
  });
}
return staticACLs;

};

  

从ACL表(数据库)获取ACL

var self = this;
var roleModel = registry.getModelByType(Role);
this.find({where: {model: model.modelName, property: propertyQuery,
  accessType: accessTypeQuery}}, function(err, acls) {
  if (err) {
    if (callback) callback(err);
    return;
  }
  var inRoleTasks = [];

  acls = acls.concat(staticACLs);