Нам необходимо предоставлять доступ к 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