Implement authentication and access control

This commit is contained in:
Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent e1bdcda191
commit 327cb78f1a
27 files changed
+600 -167

No files matched your search

+78
View File
@@ -0,0 +1,78 @@
"use strict";
const validators = {
pass: require("./validators/pass"),
test: require("./validators/test")
};
class Authorizer {
constructor(permissionSets) {
this.permissionSets = permissionSets;
this.validtorCache = new WeakMap();
this.hasAccessCache = {};
}
hasAccess(resourceType, access) {
const cacheKey = `${resourceType}-${access}`;
if (cacheKey in this.hasAccessCache)
return this.hasAccessCache[cacheKey];
let has = false;
for (const permissionSet of this.permissionSets) {
for (const perm of permissionSet) {
if (perm[resourceType]) {
if (perm[resourceType].access >= access) {
has = true;
break;
}
}
}
}
this.hasAccessCache[cacheKey] = has;
return has;
}
getValidator(resourceType, resource) {
if (this.validtorCache.has(resource))
return this.validtorCache.get(resource);
let funcs = {};
for (let permissionSet of this.permissionSets)
for (let perm of permissionSet)
if (perm[resourceType]) {
if (perm[resourceType].access >= 3) {
if (perm[resourceType].validate)
for (let [k, v] of Object.entries(perm[resourceType].validate))
funcs[k] = v;
} else {
funcs = {};
}
}
const validator = (mutationType, mutation, any) => {
let valid = false;
for (let [k, v] of Object.entries(funcs))
if (v) {
let res = validators[k](
resourceType,
resource,
mutationType,
mutation,
any
);
if (res > 0) valid = true;
else if (res < 0) return false;
}
return valid;
};
this.validtorCache.set(resource, validator);
return validator;
}
}
module.exports = Authorizer;