@incdevco/framework
Version:
node.js lambda framework
142 lines (86 loc) • 2.56 kB
JavaScript
var Promise = require('bluebird');
var Rule = require('./rule');
function Acl() {
'use strict';
this.rules = {};
/*
this.allow('Administrator', '*', '*');
this.allow('User', 'account', [
'view',
'view:balance',
'view:client_id',
'view:id',
'view:limit',
'view:name',
'view:status'
], assertions.isAccountUser);
this.allow('User', 'account_transaction', [
'view',
'view:account_id',
'view:amount',
'view:content',
'view:id',
'view:payment_id',
'view:user_id'
], assertions.isAccountUser);
this.allow('User', 'account_user', [
'view',
'view:account_id',
'view:permissions',
'view:user_id'
], assertions.isAccountUser);
*/
}
Acl.prototype.allow = function (role, resources, privileges, assertion) {
'use strict';
var rule, self = this;
if (!Array.isArray(resources)) {
resources = [resources];
}
if (!Array.isArray(privileges)) {
privileges = [privileges];
}
rule = new Rule(role, assertion);
resources.forEach(function (resource) {
privileges.forEach(function(privilege) {
self.rules[resource] = self.rules[resource] || {};
self.rules[resource][privilege] = self.rules[resource][privilege] || [];
self.rules[resource][privilege].push(rule);
});
});
return this;
};
Acl.prototype.isAllowed = function (event, resource, privilege, context) {
'use strict';
var promise = Promise.reject(false), promises = [], rules = [];
if (this.rules['*']) {
if (this.rules['*']['*']) {
this.rules['*']['*'].forEach(function (rule) {
rules.push(rule);
});
}
if (this.rules['*'][privilege]) {
this.rules['*'][privilege].forEach(function (rule) {
rules.push(rule);
});
}
}
if (this.rules[resource]) {
if (this.rules[resource][privilege]) {
this.rules[resource][privilege].forEach(function (rule) {
rules.push(rule);
});
}
}
rules.forEach(function(rule) {
//promises.push(rule.isAllowed(event, resource, privilege, context));
promise = promise.catch(function () {
return rule.isAllowed(event, resource, privilege, context);
});
});
return promise
.catch(function () {
throw new Error('Not Allowed');
});
};
module.exports = Acl;