Вход по ролям перо-аутентификация
У меня есть два пользователя в базе данных, и у них одинаковые адрес электронной почты и пароль, но разные роли. Это выглядит как:
email pass roles
+------------+------+-------
1@gmail.com 123 user
1@gmail.com 123 admin
и когда пользователь пытается войти в систему, я отправляю запрос с параметрами
{
email:"1@1.ru"
password:"123"
roles:"user"
strategy:"local"
}
Задача заключается в следующем: как я могу идентифицировать пользователя по роли (когда я отправляю запрос от внешнего пользователя с параметрами param: "пользователь" должен войти в систему по роли "пользователь", когда роли:"admin" - от администратора)
Это мой хук от автора
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(['local', 'jwt'])
],
remove: [
authentication.hooks.authenticate('jwt')
]
},
1 ответ
Пользовательский (или другой аутентифицированный) объект должен быть уникально идентифицируемым, поэтому имеет смысл хранить список ролей для одного пользователя, например:
email pass roles
+------------+------+-------
1@gmail.com 123 user,admin
А затем можете войти в систему с этим пользователем и проверить, содержит ли список ролей то, что вам нужно:
const { Forbidden } = require('feathers-errors');
function hasRole(name) {
return function(context) {
const { user = {} } = context.params;
if(!user.roles || !user.roles.split(',').includes(name)) {
throw new Forbidden('You are not allowed to access this');
}
}
}
app.service('myservice').hooks({
before: {
get: [ hasRole('user') ],
find: [ hasRole('user') ],
create: [ hasRole('admin') ],
patch: [ hasRole('admin') ],
update: [ hasRole('admin') ],
remove: [ hasRole('admin') ]
}
})