Задать вопрос
@evomed

Как спроектировать роуты?

Допустим есть вопросы. Лежат в роуте questions (там update, destroy и тд).
Есть ответы. Лежат в роуте answers.

Мне нужно добавить модерацию обоим группам. И здесь два варианта:

1) Разместить роуты модерации в подроутах. Типа questions.moderation.status_change
2) Либо создать группу роутов moderation и уже внутри него questions и answers.

Как правильно? Вариант создать один полиморфный роут модерации и разгребать в контроллере не рассматриваю т.к. везде своя логика и объектов модерации много.
  • Вопрос задан
  • 137 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Не стоит выносить модерацию на уровень API. API так и должно быть обычным CRUD (create, read, update, delete). А далее нужно внутри построить систему доступа, которая будет определять, какой пользователь что может делать с конкретной сущностью. Потому что у вас могут появиться какие-то другие пользователи, кроме модераторов которые должны будут иметь немного другие полномочия, и т.д.
Для гугления: Access Control

1. RBAC (Role-based access control). Самая простая система. Вы назначаете каждому пользователю роль или набор ролей, и при проверке, может ли данный пользователь что-то там сделать, просто проверяется, имеет ли он какую-то роль. Сделайте этот список ролей пользователя доступным в тех частях проекта, где надо проверять доступ, и спокойно себе там и проверять. Эта система очень часто прекрасно работает в простых проектах, но она не очень гибкая, и часто приходится писать много дополнительных условий, добавлять много ролей в каждое из условий. Похоже, вы пытаетесь как раз что-то подобное организовать, и вас это обилие условий раздражает.

2. Разрешения (permissions). Это слегка доработанный RBAC, где вы создаете список разрешений, которые описывают что конкретно надо разрешить, и добавляете к этому разрешению список ролей, которым это позволено. Такая система - то что нужно для простых проектов. Потому что вы не заблудитесь в дебрях условий со списком ролей, а будете проверять разрешения, которые легко читать, легко понимать. Система доступа становится глобальной, вы можете безболезненно добавлять новые роли и вносить их в списки разрешений, не меняя основной код программы. Список разрешений может храниться даже в базе данных, и тогда вы налету сможете ограничивать какие-то роли.

Например, самый простейший код на Javascript:
const permissions = {
  "view answers": ["ROLE_GUEST", "ROLE_USER"],
  "add answers": ["ROLE_USER"],
  "delete answers": ["ROLE_MODERATOR"],
  "delete own answers": ["ROLE_USER"],
  "edit answers": ["ROLE_MODERATOR"],
  "edit own answers": ["ROLE_USER"],
  "change status": ["ROLE_MODERATOR"],
};

const user1 = {
  roles: ["ROLE_USER"],
};

const user2 = {
  roles: ["ROLE_USER", "ROLE_MODERATOR"],
};

function checkPermission(user, action) {
  const activeRoles = permissions[action].filter((role) =>
    user.roles.includes(role),
  );
  return activeRoles.length > 0;
}

console.log(checkPermission(user1, "view answers")); // true
console.log(checkPermission(user1, "delete answers")); // false
console.log(checkPermission(user1, "delete own answers")); // true
console.log(checkPermission(user2, "delete answers")); // true
console.log(checkPermission(user2, "delete own answers")); // true


Система тоже имеет недостатки. Слишком сложную логику сюда не зашьёшь, и в некоторых случаях придется это делать в коде. Однако для подавляющего большинства простых проектов этого уже будет достаточно.

3. ABAC (Attribute-based access control), ReBAC (Relationship-based access control), PBAC (Policy-Based Access Control) - это уже более сложные, но в тоже время мощные и гибкие системы контроля доступа, и я оставляю их здесь для общего развития. Реализовать тот же ABAC не так уж и сложно, но за такую систему многие организации могут выложить кругленькую сумму.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы