2016-02-12 66 views
0

我想在运行时为所有模型创建acl规则。 我有包含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和启动脚本,但我不能明确的主意。

在混入文件,如何获得ACL数据以及如何assing所有型号..

我真的困惑,因为我没有二硝基甲苯时会在运行时推ACL数据适用于所有型号(如引导,混入,操作钩)。

请给任何想法。

我想在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); 
+0

我没有这样做之前获得ACL,但这个想法是不是对ACL添加到模型,而是[创建ACL ](https://apidocs.strongloop.com/loopback/#acl)_for model_然后[将其添加到注册表](https://apidocs.strongloop.com/loopback/#addacl)。再次,我以前没有这样做过,但祝你好运! – jakerella

+0

Jakererlla感谢您的回复。如果您尝试获得结果,请与我分享。 –

+0

你可以分享任何示例或教程添加注册表,我只是1个星期才开始strongloop。并且可以分享任何实时强力申请以进行培训。 –

回答

0

默认的ACL(基类)收集并连接在运行时的静态JSON ACL规则和ACL表数据,因此它会自动工作。

从Model.JSON前获得静态的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表(数据库)

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);