UNPKG

@inspire-platform/sails-hook-permissions

Version:

Comprehensive user permissions and entitlements system for sails.js and Waterline. Supports user authentication with passport.js, role-based permissioning, object ownership, and row-level security.

163 lines (133 loc) 5.94 kB
'use strict'; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var permissionPolicies = ['passport', 'sessionAuth', 'ModelPolicy', 'OwnerPolicy', 'PermissionPolicy', 'RolePolicy']; var Permissions = (function () { function Permissions(sails) { _classCallCheck(this, Permissions); this.sails = sails; } /** * This is the hook. * * @param sails * @returns {{configure: configure, initialize: initialize}} */ _createClass(Permissions, [{ key: 'initialize', value: function initialize(next) { var _this = this; var config = this.sails.config.permissions; this.sails.after('hook:auth:loaded', function () { if (!_this.validateDependencies()) { _this.sails.log.error('Cannot find @inspire-platform/sails-hook-auth hook. Did you "npm install @inspire-platform/sails-hook-auth --save"?'); _this.sails.log.error('Please see README for installation instructions: https://github.com/conceptainc/sails-hook-permissions'); return _this.sails.lower(); } if (!_this.validatePolicyConfig()) { _this.sails.log.warn('One or more required policies are missing.'); _this.sails.log.warn('Please see README for installation instructions: https://github.com/conceptainc/sails-hook-permissions'); } }); this.sails.after('hook:orm:loaded', function () { sails.models.model.find().then(function (models) { if (models.length === _lodash2['default'].keys(_this.sails.models).length) { _this.sails.hooks.permissions._modelCache = _lodash2['default'].indexBy(models, 'identity'); return next(); } return _this.initializeFixtures().then(function () { next(); }); })['catch'](function (error) { _this.sails.log.error(error); next(error); }); }); } }, { key: 'validatePolicyConfig', value: function validatePolicyConfig() { var policies = this.sails.config.policies; return _lodash2['default'].all([_lodash2['default'].isArray(policies['*']), _lodash2['default'].intersection(permissionPolicies, policies['*']).length === permissionPolicies.length, policies.AuthController && _lodash2['default'].contains(policies.AuthController['*'], 'passport')]); } /** * Install the application. Sets up default Roles, Users, Models, and * Permissions, and creates an admin user. */ }, { key: 'initializeFixtures', value: function initializeFixtures() { var _this2 = this; var fixturesPath = _path2['default'].resolve(__dirname, '../../../config/fixtures/'); return require(_path2['default'].resolve(fixturesPath, 'model')).createModels().then(function (models) { _this2.models = models; _this2.sails.hooks.permissions._modelCache = _lodash2['default'].indexBy(models, 'identity'); return require(_path2['default'].resolve(fixturesPath, 'role')).create(_this2.sails.config.permissions); }).then(function (roles) { _this2.roles = roles; var userModel = _lodash2['default'].find(_this2.models, { name: 'User' }); return require(_path2['default'].resolve(fixturesPath, 'user')).create(_this2.roles, userModel); }).then(function () { return sails.models.user.findOne({ email: _this2.sails.config.permissions.adminUser.email }); }).then(function (user) { _this2.sails.log('sails-hook-permissions: created admin user:', user); return User.update({ id: user.id }, { createdBy: user.id, owner: user.id }).meta({ fetch: true }); }).then(function (admin) { return require(_path2['default'].resolve(fixturesPath, 'permission')).create(_this2.roles, _this2.models, admin, _this2.sails.config.permissions); })['catch'](function (error) { _this2.sails.log.error(error); }); } }, { key: 'validateDependencies', value: function validateDependencies() { return !!this.sails.hooks.auth; } }]); return Permissions; })(); module.exports = function (sails) { var permissions = new Permissions(sails); return { defaults: { __configKey__: { adminUser: { username: process.env.ADMIN_USERNAME || 'admin', email: process.env.ADMIN_EMAIL || 'admin@example.com', password: process.env.ADMIN_PASSWORD || 'admin1234' }, defaultRoles: { admin: true, registered: true, 'public': true }, defaultRole: 'registered', basePermissions: { self: [], global: [] } } }, configure: function configure() { // get config var config = sails.config[this.configKey]; }, initialize: function initialize(next) { sails.after('hook:auth:loaded', function () { return permissions.initialize(next); }); } }; };