UNPKG

@hicoder/express-auth-server

Version:

Model Driver Development Stack - authentication and authorization server for mongoose and express based application. It can be enabled to work as authentication, user profile managment, and authorization management servers.

100 lines (86 loc) 2.9 kB
const meanRestExpress = require('@hicoder/express-core') const AuthzController = function() { } function getUserRoles(restController, userId) { const muserrole = restController.getModelNameByTag('auth-user-role'); // a promise return restController.ModelExecute( muserrole, 'findOne', // fine one user {account: userId} //search criteria ); } function getLoginUserRole(restController) { const mrole = restController.getModelNameByTag('auth-role'); // a promise return restController.ModelExecute( mrole, 'findOne', // fine one user {role: 'LoginUser'} //search criteria ); } function getRolePermissions(restController, roles) { const mpermission = restController.getModelNameByTag('auth-permission'); return restController.ModelExecute2( mpermission, [ ['find', [{role: {$in: roles}}]], //search criteria ['populate', ['role', 'role']], //return role name for the role reference. ['populate', ['module', 'module']] //return module name for the role reference. ] ); } function mergePermissions(permResults, permissions) { for (let p of permResults) { let m = p.module.module; // module name let mp = p.modulePermission || ''; let mr = p.resourcePermission || {}; // merge m with existing m permissions from other roles permissions[m] = permissions[m] || { mp: '', mr: {}}; permissions[m].mp += mp; for (let [key, value] of mr) { if (permissions[m].mr[key]) { permissions[m].mr[key] += value; } else { permissions[m].mr[key] = value; } } } return permissions; } AuthzController.getAccountRoles = function(restController) { function func(req, res, next) { if (!req.muser) { let err = new Error("Authorization: User not available for getting roles."); return next(err); } let userId = req.muser['_id']; if (!userId) return next(); //without setting roles. User becomes normal login user. getUserRoles(restController, userId).then(async (result) => { let role = []; if (result) { role = result.role; } let permissions = {}; try { let results = await getRolePermissions(restController, role); permissions = mergePermissions(results, permissions); // Also get the login user role permissions let loginUserRole = await getLoginUserRole(restController); let loginUserRolePerm = await getRolePermissions(restController, [loginUserRole._id]); permissions = mergePermissions(loginUserRolePerm, permissions); req.muser.role = role; req.muser.rolep = permissions; return next(); } catch(err) { req.muser.role = role; req.muser.rolep = permissions; return next(); } }).catch(err => { return next(err); }); } return func; }; module.exports = AuthzController;