Вход по ролям перо-аутентификация

У меня есть два пользователя в базе данных, и у них одинаковые адрес электронной почты и пароль, но разные роли. Это выглядит как:

  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') ]
  }
})
Другие вопросы по тегам