register = function (server, options, next) {
try {
// Validate the options passed into the plugin
Schema.assert('plugin', options, 'Invalid settings');
var settings = Hoek.applyToDefaults(internals.defaults, options || {});
server.bind({
config: settings
});
// Validate the server options on the routes
if (server.after) { // Support for hapi < 11
server.after(internals.validateRoutes);
} else {
server.ext('onPreStart', internals.validateRoutes);
}
server.ext('onPreHandler', internals.onPreHandler);
next();
} catch (e) {
next(e);
}
}...
register: require('hapi-authorization')
options: {
roles: false // By setting to false, you are not using an authorization hierarchy and you do not need to specify all the potential
roles here
}
}
];
server.register(plugins, function(err) {
...
```
## Using hapi-authorization with custom roles
1. Include the plugin in your hapijs app.
Example:
```js
...checkRoles = function (user, role, hierarchy) {
if ((!user) || (!internals.isGranted(user.role, role, hierarchy))) {
return Boom.forbidden('Unauthorized');
}
return null;
}n/a
fetchEntity = function (query, param, request, cb) {
var def = Q.defer();
query(param, request, function(err, entity) {
if (err && err.isBoom) {
return def.reject(err);
} else if (err) {
return def.reject(Boom.badRequest('Bad Request', err));
}
else if (!entity) {
return def.reject(Boom.notFound());
}
else {
def.resolve(entity);
}
});
return def.promise;
}n/a
validateEntityAcl = function (user, role, entity, validator, options) {
var def = Q.defer();
if (!entity) {
def.reject(new Error('validateUserACL must run after fetchACLEntity'));
} else if (!user) {
def.reject(new Error('User is required, please make sure this method requires authentication'));
} else {
if (validator) {
entity[validator](user, role, function(err, isValid) {
if (err) {
def.reject(new Error(err));
} else if (!isValid) { // Not granted
def.reject(Boom.forbidden('Unauthorized'));
} else { // Valid
def.resolve(isValid);
}
});
} else {
// Use the default validator
var isValid = internals.defaultEntityAclValidator(user, role, entity, options);
if (isValid) {
def.resolve(isValid);
} else {
def.reject(Boom.forbidden('Unauthorized'));
}
}
}
return def.promise;
}n/a
assert = function (type, options, message) {
var validationObj = Joi.validate(options, internals[type]);
var error = validationObj.error;
var errorMessage = null;
// If there is an error, build a nice error message
if(error) {
errorMessage = error.name + ':';
error.details.forEach(function(err) {
errorMessage += ' ' + err.message;
});
}
// If there is an error build the error message
Hoek.assert(!error, 'Invalid', type, 'options', message ? '(' + message + ')' : '', errorMessage);
return validationObj.value;
}...
errorMessage = error.name + ':';
error.details.forEach(function(err) {
errorMessage += ' ' + err.message;
});
}
// If there is an error build the error message
Hoek.assert(!error, 'Invalid', type, 'options', message ? '(
x27; + message + ')' : '', errorMessage);
return validationObj.value;
};
/**
* Validation rules for a route's params
...