Example - Jailer Library
by Chelo Quilón
JavaScript
function Jailer(locks){
locks = locks || {};
for(var i=0,k=Object.keys(locks),l=k.length;i<l;i++){
this[k[i]]=locks[k[i]];
}
}
Jailer.prototype.check = function(action,keys){
var locks = this[action];
if(!locks){return true;} // Unlocked action.
// Avoid errors.
if(!Array.isArray(locks)){locks = (typeof locks === 'string')?[locks]:[];}
if(!Array.isArray(keys)){keys = (typeof keys === 'string')?[keys]:[];}
var lock,grant;
for(var i=0,l=locks.length;i<l;i++){ // OR...
lock = locks[i].split(' ');
grant = true;
for(var i2=0,l2=lock.length;i2<l2;i2++){ // AND...
if(keys.indexOf(lock[i2]) === -1){
grant = false;
}
}
if(grant){
return true;
}
}
return false;
};
// ----------------------------------------------- EXAMPLE CODE -----------------------------
var jailer = new Jailer({
remove: ['admin'],
// Action:'remove', only: ['admin'].
edit: ['editor owner','admin','publisher'],
// Action:'edit', only: ['admin'] or ['publisher'] or ['editor' and 'owner']
view: ['editor','admin','publisher','guest privileged']
// Action:'view', only ['editor'] or ['admin'] or ['publisher'] or ['guest' and 'privileged']
});
console.log(jailer.check('remove',['guest'])); // nop
console.log(jailer.check('remove',['owner'])); // nop
console.log(jailer.check('remove',['admin'])); // yes!
console.log(jailer.check('edit',['editor','guest'])); // nop
console.log(jailer.check('edit',['publisher','manager'])); // yes!
console.log(jailer.check('edit',['editor','owner'])); // yes!
console.log(jailer.check('view',['guest'])); // nop
console.log(jailer.check('view',['anonymous'])); // nop
console.log(jailer.check('view',['editor','owner'])); // yes!
console.log(jailer.check('view',['guest','privileged','VIP'])); // yes!