Fresh — это современный фреймворк для разработки веб-приложений на базе Deno. Он строится вокруг принципов простоты, высокой производительности и минимального уровня абстракции. В контексте ролей и прав доступа Fresh обеспечивает гибкую систему управления доступом к ресурсам приложения.
Роли представляют собой логические группы пользователей с определёнными правами. Каждая роль описывает набор действий, которые пользователь может выполнять в приложении. В Fresh роли обычно задаются на уровне серверного кода и используются для контроля доступа к страницам и API-эндпоинтам.
Пример структуры ролей:
const roles = {
ADMIN: "admin",
EDITOR: "editor",
USER: "user",
};
В Fresh роли привязываются к объекту пользователя, который хранится в сессии или в базе данных. Структура пользователя может выглядеть так:
const user = {
id: 1,
username: "ivan",
role: roles.EDITOR,
};
Эта информация используется при обработке запросов для определения, разрешено ли пользователю выполнять определённое действие.
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 в 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 });
При обработке последующих запросов роль извлекается из сессии и используется для контроля доступа.
Эти принципы обеспечивают структурированное и безопасное управление доступом в приложениях на Fresh.