Роли и права доступа

Fresh — это современный фреймворк для разработки веб-приложений на базе Deno. Он строится вокруг принципов простоты, высокой производительности и минимального уровня абстракции. В контексте ролей и прав доступа Fresh обеспечивает гибкую систему управления доступом к ресурсам приложения.


Роли пользователей

Роли представляют собой логические группы пользователей с определёнными правами. Каждая роль описывает набор действий, которые пользователь может выполнять в приложении. В Fresh роли обычно задаются на уровне серверного кода и используются для контроля доступа к страницам и API-эндпоинтам.

Пример структуры ролей:

const roles = {
  ADMIN: "admin",
  EDITOR: "editor",
  USER: "user",
};
  • ADMIN — полные права на все ресурсы, включая управление пользователями и настройками приложения.
  • EDITOR — права на создание и редактирование контента, но без доступа к административным настройкам.
  • USER — базовые права, такие как просмотр контента и взаимодействие с публичными разделами.

Привязка ролей к пользователям

В Fresh роли привязываются к объекту пользователя, который хранится в сессии или в базе данных. Структура пользователя может выглядеть так:

const user = {
  id: 1,
  username: "ivan",
  role: roles.EDITOR,
};

Эта информация используется при обработке запросов для определения, разрешено ли пользователю выполнять определённое действие.


Middleware для контроля доступа

Fresh позволяет использовать middleware для проверки прав доступа. Middleware выполняется перед обработкой запроса и может перенаправлять пользователя или возвращать ошибку при отсутствии соответствующих прав.

Пример middleware для проверки роли:

function requireRole(requiredRole) {
  return async (req, next) => {
    const user = req.state.user;
    if (!user || user.role !== requiredRole) {
      return new Response("Доступ запрещён", { status: 403 });
    }
    return next();
  };
}

Middleware можно подключить к маршруту или группе маршрутов, обеспечивая централизованный контроль доступа.


Контроль доступа на уровне страниц

Для страниц Fresh контроль доступа может быть реализован с помощью серверной функции handler. В зависимости от роли пользователя можно возвращать страницу, редиректить или показывать сообщение об ошибке.

Пример:

export const handler = {
  GET: async (req, ctx) => {
    const user = ctx.state.user;
    if (!user || user.role !== roles.ADMIN) {
      return new Response("Нет прав доступа", { status: 403 });
    }
    return ctx.render({ data: "Секретные данные" });
  },
};

Разграничение прав на API

Для API в Fresh можно использовать тот же подход через middleware или проверку внутри обработчика. Это позволяет ограничить операции CRUD в зависимости от роли пользователя.

Пример проверки роли для API:

export const handler = {
  POST: async (req, ctx) => {
    const user = ctx.state.user;
    if (!user || ![roles.ADMIN, roles.EDITOR].includes(user.role)) {
      return new Response("Доступ запрещён", { status: 403 });
    }
    const body = await req.json();
    // логика создания записи
    return new Response(JSON.stringify({ success: true }));
  },
};

Динамическое управление правами

Fresh позволяет динамически изменять права пользователей без перезапуска приложения. Обычно для этого используется база данных с таблицей ролей и прав. Приложение считывает актуальные права при каждом запросе, что позволяет гибко управлять доступом.

Структура таблицы прав:

Role Resource Permission
ADMIN all read/write
EDITOR posts read/write
USER posts read

На основе этих данных строится проверка внутри middleware или обработчиков.


Интеграция с сессиями

Для сохранения роли пользователя между запросами в Fresh используют сессии. При входе пользователя его роль сохраняется в объекте сессии, что позволяет серверу проверять права без повторного запроса к базе данных при каждом запросе.

Пример сохранения роли в сессии:

await session.set("user", { id: user.id, role: user.role });

При обработке последующих запросов роль извлекается из сессии и используется для контроля доступа.


Выводы по организации ролей

  • Роли позволяют централизованно управлять доступом пользователей к страницам и API.
  • Middleware и обработчики Fresh обеспечивают гибкую проверку прав на уровне запроса.
  • Динамическое управление правами через базу данных упрощает масштабирование и поддержку приложения.
  • Интеграция с сессиями позволяет сохранять состояние пользователя между запросами без потери безопасности.

Эти принципы обеспечивают структурированное и безопасное управление доступом в приложениях на Fresh.