В настоящее время я создаю прототип Node JS API и внедряю авторизацию с использованием Easy RBAC
https://www.npmjs.com/package/easy-rbac
В этом модуле вы определяете модель RBAC, например:
{
user: { // Role name
can: [ // list of allowed operations
'account',
'post:add',
{
name: 'post:save',
when: async (params) => params.userId === params.ownerId
},
'user:create',
{
name: 'user:*',
when: async (params) => params.id === params.userId
}
]
},
manager: {
can: ['post:save', 'post:delete', 'account:*'],
inherits: ['user']
},
admin: {
can: ['rule the server'],
inherits: ['manager']
}
}
Затем в функции вы можете задавать вопросы, такие как
rbac.can('user', 'post:save', {userId: 1, ownerId: 2})
.then(result => {
if (result) {
// we are allowed access
} else {
// we are not allowed access
}
})
.catch(err => {
// something else went wrong - refer to err object
});
. Что мне не ясно из документации, так это то, как это можно применить к конкретному пользователю, которому назначена роль.
Запуск "rbac.can" всегда будет приводить к истине, принимая приведенное выше определение, независимо от пользователя (поскольку это всего лишь определение модели RBAC)
Скажем, "ДжонDoe "играет роль" admin ".... (который мы храним в базе данных mongo)
Если не считать ...
if(userSession.hasRole("admin") && rbac.can("admin","post:save"....)
Как я могу проверить, есть ли" John "действительно может выполнить действие?