express-acler
Version:
ACL manager for Express using ACLer
72 lines (59 loc) • 1.56 kB
JavaScript
const { check } = require("acler");
const dp = require("dot-prop-immutable");
const R = require("ramda");
module.exports = config => {
const defaults = {
roles: "user.roles",
permissions: "user.permissions",
errors: {
roles: "You not allowed to this resource",
permissions: "You not allowed to this resource"
}
};
const { roles, permissions, errors } = R.merge(defaults, config);
return {
is(acl) {
return (req, res, next) => {
const r = dp.get(req, roles);
if (!r) {
throw Error("User roles is required");
}
const is = check(acl, roles => {
return r.includes(roles);
});
if (!is) {
throw Error(errors.roles);
}
next();
};
},
can(acl) {
return (req, res, next) => {
let p = dp.get(req, permissions);
const r = dp.get(req, roles);
if (!p) {
throw Error("User permissions is required");
}
if (r) {
r.forEach(role => {
rolesPermissions = [];
if (typeof role === "object") {
rolesPermissions = R.concat(
rolesPermissions,
R.head(R.values(role))
);
}
});
p = R.uniq(p.concat(rolesPermissions));
}
const is = check(acl, permissions => {
return p.includes(permissions);
});
if (!is) {
throw Error(errors.permissions);
}
next();
};
}
};
};