我正在尝试在运行时为所有模型创建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);
答案 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);