Skip to content

Instantly share code, notes, and snippets.

@rschmukler
Created August 30, 2013 21:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rschmukler/6394548 to your computer and use it in GitHub Desktop.
Save rschmukler/6394548 to your computer and use it in GitHub Desktop.
//components/access-control/access-control.js
var isBrowser = require('is-browser');
var userRoles = exports.userRoles = {
anon: 1,
user: 2,
admin: 4
};
var accessLevels = exports.accessLevels = {
any: userRoles.anon | userRoles.user | userRoles.admin,
anon: userRoles.anon,
user: userRoles.user | userRoles.admin,
admin: userRoles.admin
};
if(isBrowser) {
var AccessControl = angular.module('spotlight.access-control', ['ngCookies']).factory('Auth', ['$http', '$rootScope', '$cookieStore',
function($http, $rootScope, $cookieStore) {
var currentUser = $cookieStore.get('user') || { username: '', role: userRoles.anon };
$cookieStore.remove('user');
return {
authorize: function(accessLevel, role) {
if(role === undefined)
role = currentUser.role;
return accessLevel & role;
},
isLoggedIn: function(user) {
if(user === undefined)
user = currentUser;
return user.role & (userRoles.admin | userRoles.user);
},
accessLevels: accessLevels,
userRoles: userRoles,
user: currentUser
};
}]);
AccessControl.directive('accessLevel', ['Auth', function(Auth) {
return {
restrict: 'A',
link: function($scope, element, attrs) {
var prevDisp = element.css('display'),
userRole,
accesslevel;
$scope.currentUser = Auth.user;
$scope.$watch('currentUser', function(user) {
if(user.role)
userRole = user.role;
updateCSS();
}, true);
attrs.$observe('accessLevel', function(al) {
if(al) accessLevel = Auth.accessLevels[al];
});
function updateCSS() {
if(userRole && accessLevel) {
if(!Auth.authorize(accessLevel, userRole))
element.css('display', 'none');
else
element.css('display', prevDisp);
}
}
}
};
}]);
}
AccessControl = require('access-control');
app.get('/*', function(req, res, next) {
var role = AccessControl.userRoles.anon, username = '';
if(req.user) {
role = req.user.role();
username = req.user.username()
}
res.cookie('user', JSON.stringify({
username: username,
role: role
}));
res.render('./lib/pages/site-wide/layout.jade');
})
// User-model/user-model.js
var modella = require('modella'),
UserRoles = require('access-control').userRoles;
var User = module.exports = modella('User')
.attr('username' , { required: true, unique: true, type: 'string' } )
.attr('role' , { required: true, type: 'number', default: UserRoles.User } )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment