97 lines
3.2 KiB
JavaScript
Executable File
97 lines
3.2 KiB
JavaScript
Executable File
(function(exports){
|
|
|
|
var config = {
|
|
|
|
/* List all the roles you wish to use in the app
|
|
* You have a max of 31 before the bit shift pushes the accompanying integer out of
|
|
* the memory footprint for an integer
|
|
*/
|
|
roles :[
|
|
'public',
|
|
'user',
|
|
'admin'],
|
|
|
|
/*
|
|
Build out all the access levels you want referencing the roles listed above
|
|
You can use the "*" symbol to represent access to all roles
|
|
*/
|
|
accessLevels : {
|
|
'public' : "*",
|
|
'anon': ['public'],
|
|
'user' : ['user', 'admin'],
|
|
'admin': ['admin']
|
|
}
|
|
|
|
};
|
|
|
|
exports.userRoles = buildRoles(config.roles);
|
|
exports.accessLevels = buildAccessLevels(config.accessLevels, exports.userRoles);
|
|
|
|
/*
|
|
Method to build a distinct bit mask for each role
|
|
It starts off with "1" and shifts the bit to the left for each element in the
|
|
roles array parameter
|
|
*/
|
|
|
|
function buildRoles(roles){
|
|
|
|
var bitMask = "01";
|
|
var userRoles = {};
|
|
|
|
for(var role in roles){
|
|
var intCode = parseInt(bitMask, 2);
|
|
userRoles[roles[role]] = {
|
|
bitMask: intCode,
|
|
title: roles[role]
|
|
};
|
|
bitMask = (intCode << 1 ).toString(2)
|
|
}
|
|
|
|
return userRoles;
|
|
}
|
|
|
|
/*
|
|
This method builds access level bit masks based on the accessLevelDeclaration parameter which must
|
|
contain an array for each access level containing the allowed user roles.
|
|
*/
|
|
function buildAccessLevels(accessLevelDeclarations, userRoles){
|
|
|
|
var accessLevels = {};
|
|
for(var level in accessLevelDeclarations){
|
|
|
|
if(typeof accessLevelDeclarations[level] == 'string'){
|
|
if(accessLevelDeclarations[level] == '*'){
|
|
|
|
var resultBitMask = '';
|
|
|
|
for( var role in userRoles){
|
|
resultBitMask += "1"
|
|
}
|
|
//accessLevels[level] = parseInt(resultBitMask, 2);
|
|
accessLevels[level] = {
|
|
bitMask: parseInt(resultBitMask, 2),
|
|
title: accessLevelDeclarations[level]
|
|
};
|
|
}
|
|
else console.log("Access Control Error: Could not parse '" + accessLevelDeclarations[level] + "' as access definition for level '" + level + "'")
|
|
|
|
}
|
|
else {
|
|
|
|
var resultBitMask = 0;
|
|
for(var role in accessLevelDeclarations[level]){
|
|
if(userRoles.hasOwnProperty(accessLevelDeclarations[level][role]))
|
|
resultBitMask = resultBitMask | userRoles[accessLevelDeclarations[level][role]].bitMask
|
|
else console.log("Access Control Error: Could not find role '" + accessLevelDeclarations[level][role] + "' in registered roles while building access for '" + level + "'")
|
|
}
|
|
accessLevels[level] = {
|
|
bitMask: resultBitMask,
|
|
title: accessLevelDeclarations[level][role]
|
|
};
|
|
}
|
|
}
|
|
|
|
return accessLevels;
|
|
}
|
|
|
|
})(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); |