capstone-accesscontrol
Version:
Role and Attribute based Access Control for Node.js
158 lines (157 loc) • 5.64 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Permission = void 0;
var utils_1 = require("../utils");
/**
* Represents the inner `Permission` class that defines the granted or denied
* access permissions for the target resource and role.
*
* You can check for a permission in two ways:
*
* <ul>
* <li>
* You can first obtain a {@link ?api=ac#AccessControl~Query|`Query` instance}
* via {@link ?api=ac#AccessControl#can|`AccessControl#can`} which returns
* a `Permission` instance when an action method such as
* {@link ?api=ac#AccessControl~Query#createAny|`.createAny()`} is
* called.
* <p><pre><code> var permission = ac.can('user').createAny('video');
* console.log(permission.granted); // boolean</code></pre></p>
* </li>
* <li>
* Or you can call {@link ?api=ac#AccessControl#permission|`AccessControl#permission`}
* by passing a fulfilled {@link ?api=ac#AccessControl#IQueryInfo|`IQueryInfo` object}.
* <p><pre><code> var permission = ac.permission({
* role: 'user',
* resource: 'video',
* action: 'create',
* possession: 'any'
* });
* console.log(permission.granted); // boolean</code></pre></p>
* </li>
* </ul>
*
* @class
* @inner
* @memberof AccessControl
*/
var Permission = /** @class */ (function () {
/**
* Initializes a new `Permission` instance.
* @private
*
* @param {IQueryInfo} query
* An `IQueryInfo` arbitrary object.
*/
function Permission(grants, query) {
/**
* @private
*/
this._ = {};
// set attributes first. this also validates the `query` object.
this._.attributes = utils_1.utils.getUnionAttrsOfRoles(grants, query);
this._.role = query.role;
this._.resource = query.resource;
this._.value = query.value;
}
Object.defineProperty(Permission.prototype, "roles", {
/**
* Specifies the roles for which the permission is queried for.
* Even if the permission is queried for a single role, this will still
* return an array.
*
* If the returned array has multiple roles, this does not necessarily mean
* that the queried permission is granted or denied for each and all roles.
* Note that when a permission is queried for multiple roles, attributes
* are unioned (merged) for all given roles. This means "at least one of
* these roles" have the permission for this action and resource attribute.
*
* @name AccessControl~Permission#roles
* @type {Array<String>}
* @readonly
*/
get: function () {
return this._.role;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Permission.prototype, "resource", {
/**
* Specifies the target resource for which the permission is queried for.
*
* @name AccessControl~Permission#resource
* @type {String}
* @readonly
*/
get: function () {
return this._.resource;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Permission.prototype, "attributes", {
/**
* Gets an array of allowed attributes which are defined via
* Glob notation. If access is not granted, this will be an empty array.
*
* Note that when a permission is queried for multiple roles, attributes
* are unioned (merged) for all given roles. This means "at least one of
* these roles" have the permission for this action and resource attribute.
*
* @name AccessControl~Permission#attributes
* @type {Array<String>}
* @readonly
*/
get: function () {
return this._.attributes;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Permission.prototype, "granted", {
/**
* Specifies whether the permission is granted. If `true`, this means at
* least one attribute of the target resource is allowed.
*
* @name AccessControl~Permission#granted
* @type {Boolean}
* @readonly
*/
get: function () {
var _this = this;
if (!this.attributes || this.attributes.length === 0)
return false;
// just one non-negated attribute is enough.
return this.attributes.some(function (attr) {
if (typeof attr === 'string') {
return attr.trim().slice(0, 1) !== '!';
}
else if (typeof attr === 'object') {
if (attr['value'] !== '*' && attr['value'] !== _this._.value) {
return false;
}
}
return true;
});
},
enumerable: false,
configurable: true
});
/**
* Filters the given data object (or array of objects) by the permission
* attributes and returns this data with allowed attributes.
*
* @param {Object|Array} data
* Data object to be filtered. Either a single object or array
* of objects.
*
* @returns {Object|Array}
* The filtered data object.
*/
Permission.prototype.filter = function (data) {
return utils_1.utils.filterAll(data, this.attributes);
};
return Permission;
}());
exports.Permission = Permission;
;