SHARE
TWEET

Untitled

a guest Dec 15th, 2014 188 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. angular.module('xenon.providers', []).
  4.  
  5.     provider('Authentication', function () {
  6.  
  7.         var currentUser = {name: 'Unknown'};
  8.    
  9.         var config = {
  10.  
  11.             roles :[
  12.                 'public',
  13.                 'user',
  14.                 'admin'
  15.             ],
  16.  
  17.             //  user     : allowed access
  18.             accessLevels : {
  19.                 'public' : "*",
  20.                 'anon'   : ['public'],
  21.                 'user'   : ['user', 'admin'],
  22.                 'admin'  : ['admin']
  23.             }
  24.  
  25.         }
  26.  
  27.  
  28.         /*
  29.             Method to build a distinct bit mask for each role
  30.             It starts off with "1" and shifts the bit to the left for each element in the roles array parameter
  31.          */
  32.  
  33.         function buildRoles(roles) {
  34.  
  35.             var bitMask = "01";
  36.             var userRoles = {};
  37.  
  38.             for(var role in roles){
  39.                 var intCode = parseInt(bitMask, 2);
  40.                 userRoles[roles[role]] = {
  41.                     bitMask: intCode,
  42.                     title: roles[role]
  43.                 };
  44.                 bitMask = (intCode << 1 ).toString(2)
  45.             }
  46.  
  47.             return userRoles;
  48.         }
  49.  
  50.         /*
  51.         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.
  52.          */
  53.         function buildAccessLevels(accessLevelDeclarations, userRoles) {
  54.  
  55.             var accessLevels = {};
  56.             for(var level in accessLevelDeclarations){
  57.  
  58.                 if(typeof accessLevelDeclarations[level] == 'string'){
  59.                     if(accessLevelDeclarations[level] == '*'){
  60.  
  61.                         var resultBitMask = '';
  62.  
  63.                         for( var role in userRoles){
  64.                             resultBitMask += "1"
  65.                         }
  66.                         //accessLevels[level] = parseInt(resultBitMask, 2);
  67.                         accessLevels[level] = {
  68.                             bitMask: parseInt(resultBitMask, 2)
  69.                         };
  70.                     }
  71.                     else console.log("Access Control Error: Could not parse '" + accessLevelDeclarations[level] + "' as access definition for level '" + level + "'")
  72.  
  73.                 }
  74.                 else {
  75.  
  76.                     var resultBitMask = 0;
  77.                     for(var role in accessLevelDeclarations[level]){
  78.                         if(userRoles.hasOwnProperty(accessLevelDeclarations[level][role]))
  79.                             resultBitMask = resultBitMask | userRoles[accessLevelDeclarations[level][role]].bitMask
  80.                         else console.log("Access Control Error: Could not find role '" + accessLevelDeclarations[level][role] + "' in registered roles while building access for '" + level + "'")
  81.                     }
  82.                     accessLevels[level] = {
  83.                         bitMask: resultBitMask
  84.                     };
  85.                 }
  86.             }
  87.  
  88.             return accessLevels;
  89.         }
  90.    
  91.         function userRoles() {
  92.             return buildRoles(config.roles);
  93.         }
  94.    
  95.         function accessLevels() {
  96.             buildAccessLevels(config.accessLevels, buildRoles(config.roles));
  97.         }
  98.        
  99.         function isAllowed(access) {
  100.             return accessLevels.bitMask & currentUser.role.bitMask;
  101.         }
  102.    
  103.         return {
  104.             userRoles: userRoles,
  105.             accessLevels: accessLevels,
  106.             $get: function ($http, $q) {
  107.                 return {
  108.                     currentUser: currentUser,
  109.                     isAllowed: isAllowed,
  110.                     userData: function() {
  111.                         return $http.get('/api/userData').then(function(res){
  112.                             angular.extend(currentUser, res.data);
  113.                             return currentUser;
  114.                         });
  115.                     }
  116.                 }
  117.             }
  118.         }
  119.     });
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top