Авторизация
ЛР32
Создаем на Github репозиторий cwp-32, клонируем его, открываем в IDE
Устанавливаем express, body-parser и casl
Данные будем хранить в оперативной памяти. Заполним массивы тестовыми данными по приведенным схемам
Repo
"id": int
"name": string
"author": string
Commit
"id": int
"repoId": int
"message": string
"hash": string
Создадим REST API для предоставления доступа к данным:
1. Пять endpoint-ов для CRUD операций с репозиториями
2. Пять endpoint-ов для CRUD операций с коммитами (вложены в путь репозиториев)
Нам необходимо предоставлять доступ к API по приведенным правилам
1. Гость (guest) может:
а) просматривать коммиты и репозитории
2. Зарегестрированный пользователь (member) может:
а) просматривать коммиты и репозитории
б) создавать репозитории
в) создавать коммиты к своим репозиториям
г) редактировать свои репозитории и коммиты
3. Модератор (moderator) может:
а) просматривать коммиты и репозитории
б) редактировать репозитории и коммиты
в) удалять репозитории и коммиты
Для этого создадим глобальный middleware, который будет строить объект-доступа (ability) с помощью casl в зависимости от переданной в запросе роли. Также вместе с ролью в запросе будем передавать имя пользователя. Это требуется для проверки прав на принадлежность репозитория.
...
app.use('/api', (req, res, next) => {
  const { rules, can, cannot } = AbilityBuilder.extract();
  const role = req.query.role || req.body.role || 'guest';

  if (role === 'guest') {
      can(...);
      ...
  }

  if (role === 'member') {
      can(...);
      ...
  }

  ...

  req.ability = new Ability(rules);

  next();
});
...
Внесём изменения в методы API для использования объекта-доступа для проверки авторизованности запроса. В случае ошибки вернём 403.
Добавим в API метод ability возвращающий набор правил в формате json в поле rules. Его можно получить из req.ability.rules
Покажите работу API для разных ролей
Документация по casl