2016-02-12 67 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);