This loopback component add a new dynamic user role which mapping the operators of model to the role.
The role name should be '[modelName]' + '.' + '[operator]'. The role should be mapped into the ACL too.
And the role can be nested like this:
Role1:
User.add
Role2:
Role1
Role3:
Role2The Role3 should has the User.add role too.
The role could have multi containers of permission(aother role) or permissions.
The Permission is the model with operation. You can use the * to match the any model or any operation.
eg, '*.add', 'User.*'.
Add the .owned dynamical roles to edit, view, find, and delete roles as postfix.
For only edit/delete/view/find owned items.
Note:
- The same role could be exists in multi-roles.
- Disable batch update roles.
- The nested max level of role to limit. see config:
maxLevel
- Install in you loopback project:
npm install --save loopback-component-role-user
-
Create a component-config.json file in your server folder (if you don't already have one)
-
Configure options inside
component-config.json:
{
"loopback-component-role-user": {
"enabled": true,
"cached": 0,
"role": "$user",
"userModel": "User",
"roleIdFieldName": "name",
"rolesFieldName": "roles",
"permsFieldName": "_perms",
"roleRefsFieldName": "_roleRefs",
"models": [],
"operations":[]
}
}enabled[Boolean]: whether enable this component. defaults: truecached: [Integer]: whether cache the perms. defaults: 10'none': no cache. you can write the custom _getPerms class method on the Role model to your cache.1'updated': the cached perms updated when the role updated(default)2'manual': if the _perms is not empty use the cached _perms else calc perms and update the _perms.- NOTE: you should update the
_permsfield by yourself. just empty it for updated.
- NOTE: you should update the
deleteUsedRole[Boolean]: whether allow to cascade delete used roles. defaults: false- only for updated
cached: 1.
- only for updated
maxLevel[Integer]: the max nested role level to limit. defaults: 10role[String] : the role name. defaults: $userroleModel[string]: The role model to inject. defaults: Role- The
rolesFieldNameandpermsFieldNamefields will be added to the Model. - The
hasPermmethod will be added to the Model. - The
addRolesandremoveRolesmethods will be added if therolesFieldNameis 'roles'.- The
Role.addRolesandRole.removeRolespermissions are added too.
- The
- The
userModel[string]: The user model to inject. defaults: User- The
rolesFieldNameandpermsFieldNamefields will be added to the User Model. - The
hasPermmethod will be added to the User Model. - The
addRolesandremoveRolesmethods will be added if therolesFieldNameis 'roles'.- The
User.addRolesandUser.removeRolespermissions are added too.
- The
- The
rolesFieldName[string]: The roles field to define. defaults: roles- The model(role) can have zero or more roles/permissions.
permsFieldName[string]: The cached perms of this role. defaults: _perms- Cache all the permissions to the roles(Readonly).
ownerFieldName[string]: The owner id field to define. defaults: creatorIdroleRefsFieldName[string]: The cached items which reference this role(Readonly). defaults: _roleRefsmodels[Boolean|Array of string]. defaults: true- enable the user role to the models.
truemeans all models in the app.models.
- enable the user role to the models.
operations[Object]: the mapping operations of model to the role name.-
the
keyis the operation(method), thevalueis the role name. -
Note: the operations name is the role name if no mapping operations.
-
defaults:
{ create: 'add', upsert: 'edit', updateAttributes: 'edit', exists: 'view', findById: 'view', find: 'find', findOne: 'find', count: 'find', destroyById: 'delete', deleteById: 'delete' }
-
Just enable it on component-config.json.
set DEBUG=loopback:security:role:user env vaiable to show debug info.
Model::hasPerm(perm)
- add the
cachedto determine whether cache the perms.
- add the
.owneddynamical roles toedit.owned,view.owned,find.owned, anddelete.owned. Only edit/delete/view/find owned items.
- remove the limits: The same permission CAN NOT be exists in multi-roles.
- [bug] the hasPerm should use the match function instead minimatch
- [bug] updatePermsByRefs can not work properly.
- [bug] mongodb error: key can not contain "." for _perms is object
- [bug] can not change itself to roleRefs after roles changed
- add the
maxLeveloption to limit the max nested role level to avoid recusive
- avoid exception when component not enabled.
- add the
deleteUsedRoleoption to allow or forbidden cascade delete
- remove the deprecated
adminRoleoption. you can define the admin Role with*.*principal.
- rename the operators option to operations
- Customize the Role and User Model.
- remove
hasRoleMethod.
- add the
Rolesmxin.- Define the
rolesandpermsfields.- roles: the
- Add the
hasPerm,addRolesandremoveRolesmethods.
- Define the
- add the
hasPerm,addRolesandremoveRolesmethods to Role and User Model.
- Performance optimization.
- cache permissions and references.
- add the
Role::hasRole