Перейти к содержимому
Все статьи
3 мин чтения

Ваш воркспейс — это граница безопасности.

Почему проверки владения принадлежат каждому чтению и записи, и почему URL задачи никогда не должен давать доступ.

команда supastack

Выводите владение на сервере

ID записи что-то идентифицирует; он не доказывает, кто может её читать. supastack ограничивает записи пользователей по workspaceId. Сервер разрешает воркспейс аутентифицированного пользователя и включает эту область при чтении или изменении записи.

Не считайте ID воркспейса, отправленный браузером, доказательством владения. Браузер может запросить действие, но доверенный серверный контекст должен установить, чьё это действие. Это правило должно работать для статуса задач, сохранённой конфигурации провайдеров, записей использования и каждого продуктового ресурса. Лейауты и компоненты могут фильтровать отображаемое, но рендеринг — не авторизация; проверка принадлежит тому месту, где запись реально читается или пишется.

Всё остальное в этом посте следует из этого правила: владение выводится, а не запрашивается. В момент, когда присланный клиентом workspaceId где-то получает доверие, любая другая проверка становится декорацией. Пост об аутентификации покрывает, как сама сессия устанавливается выше этой границы.

Членство — часть границы

Ограничение области отвечает, какому воркспейсу принадлежит запись; членство отвечает, принадлежит ли этот пользователь тому воркспейсу. Разрешайте оба на сервере. supastack моделирует личные воркспейсы и воркспейсы организаций с ролями owner, admin и member — руководство по воркспейсам документирует модель.

Роли добавляют вторую ось: участник может читать то, что менять вправе только администратор. Держите две проверки раздельными — «принадлежит этому воркспейсу» и «может выполнить это действие», — чтобы понижение или удаление действовало на той же границе, что и всё остальное. Приглашения и удаления — часть того же жизненного цикла, а не административная запоздалая мысль.

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

Тестируйте запросы, которые должны падать

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

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

  • Второй воркспейс запрашивает тот же ID записи — отклонено.
  • Анонимный запрос бьёт в тот же эндпоинт — отклонено.
  • Участник, удалённый из воркспейса, повторяет — отклонено.
  • Запись называет другого владельца или воркспейс — отклонено, ничего не мутировано.
  • Ответы об ошибках остаются общими — никаких секретов и деталей схемы.

Перенесите правило в свой продукт

Добавляя новую продуктовую таблицу, определите её владение до построения экрана. Включите workspaceId в модель персистентности, разрешайте воркспейс через существующую серверную границу и используйте этот контекст в операциях списка и деталей.

Фоновые работники нуждаются в той же заботе. Поставленная в очередь задача должна нести достаточно доверенного контекста для загрузки правильной записи, пока креденшелы провайдеров остаются на сервере. Запланированная задача, загружающая строки по голому ID, всё ещё внутри границы. Последовательное правило владения проще поддерживать, чем набор маршрутно-специфичных исключений.

Поверхность API принадлежит той же границе. Ключи API воркспейса и подписанные исходящие вебхуки несут с собой область воркспейса — ключ никогда не должен становиться способом читать через тенантов, а полезная нагрузка вебхука никогда не должна нести записи соседа. Руководство по модулю API покрывает форму этой поверхности.

Частые вопросы об изоляции воркспейсов

Мультитенантная изоляция поднимает одну и ту же горсть вопросов в каждом проекте. Вот те, которые стоит решить рано.

  • Достаточно ли ограничения области на уровне приложения или нужна безопасность на уровне строк? — Серверно обеспечиваемое ограничение области на каждом чтении и записи покрывает модель угроз большинства SaaS. RLS базы добавляет эшелонированную защиту, но не заменяет проверки границы — работникам и ключам API нужно то же правило.
  • Как должен работать обмен между воркспейсами? — Моделируйте его явно — приглашением, строкой членства, — а не ослаблением области. «Любой со ссылкой» должен быть спроектированной функцией со своими проверками, а не случайностью.
  • Что ломается первым в мультитенантных приложениях? — Удобные пути: ссылки восстановления, административные инструменты, фоновые работники, загружающие записи по голому ID. Аудируйте каждый путь кода, который трогает запись в обход обычной области.
  • Как добавить ограничение области в существующую таблицу? — Добавьте workspaceId, заполните его задним числом, обеспечьте его в чтениях и записях, затем троньте UI. Поставьте сначала негативные тесты, чтобы граница была доказана, а не предполагалась.
  • Нужны ли серверным действиям проверки, если страница защищена? — Да. Защита страниц скрывает экраны; она не авторизует операции. Каждое действие разрешает сессию и воркспейс независимо.

Часто задаваемые вопросы

14 вопросов

Что такое supastack?

supastack — модульная основа для создания SaaS-продуктов с AI. Она объединяет общую инфраструктуру, чтобы вы могли сосредоточиться на продуктовых функциях.

Поддерживает ли он web и mobile?

Да. supastack включает приложения Next.js и Expo как отправные точки для web- и мобильных интерфейсов.

Какая аутентификация включена?

Better Auth покрывает e-mail/пароль, OTP и социальный вход. Личные воркспейсы провижинируются вместе с аккаунтом, чтобы продуктовые записи были ограничены с первого дня.

Как он поддерживает AI?

supastack включает настраиваемый мультипровайдерный AI, учёт использования, бюджеты и зашифрованную поддержку bring-your-own-key.

Как обрабатываются подписки?

Для продуктов на ките Stripe-биллинг, подписки и права доступа образуют основу платного доступа. Секреты провайдеров остаются только на сервере.

Где живёт мой продуктовый код?

Продуктовые функции остаются в отдельном коде, а продукт настраивает и интегрирует модули основы supastack.

Как устроены цены supastack?

Кит — разовая покупка с пожизненными обновлениями: один фреймворк за $249 (временная стартовая цена — скидка $100 от стандартной цены $349) или все фреймворки (Next.js, iOS, Android) за $499 (временная стартовая цена — скидка $100 от стандартной цены $599), плюс $75 за каждое дополнительное место разработчика. Без подписки на кит. Оплата на этом сайте доставляет лицензионный ключ по e-mail, доступ к репозиторию — через приглашение GitHub.

Как воркспейсы ограничивают мои данные?

Записи пользователей ограничены по workspaceId. Идентичность, права доступа, AI-использование, события биллинга и записи аудита остаются внутри границы личного воркспейса.

Как работают фоновые задачи?

Trigger.dev — явный рантайм задач. Контракт JobRunner обещает только enqueue, status и cancel — семантика workflow остаётся специфичной для Trigger.dev и явной.

Чем почта отличается от рассылок?

Транзакционная почта покрывает продуктовые сценарии вроде уведомлений о завершении. Холодные рассылки и кампании — забота продукта, вне почтового модуля этого кита.

Как работают покупки в мобильном приложении?

Мобильное приложение поддерживает нативные покупки и восстановление через RevenueCat, а сервер проверяет доступ. Настройте аккаунты магазинов и завершите тестирование на устройствах перед публикацией. Веб-оплата остается отдельной.

Где хранятся ключи AI-провайдеров?

Bring-your-own-key креденшелы зашифрованы и остаются только на сервере. Ключи удаляются из логов; использование и бюджеты видны на уровне воркспейса.

Какие способы оплаты принимает оформление заказа?

Оформление заказа на Stripe принимает карты, а после включения кошельков в аккаунте Stripe может также предлагать Alipay и WeChat Pay — удобно для покупателей из Китая. Авторизации кошельков подтверждаются асинхронно, поэтому страница лицензии обновляется, как только платёж завершается.

Могу ли я получить возврат средств?

После получения доступа к репозиторию supastack остается вашим навсегда, поэтому возврат средств невозможен. Но будьте уверены: вы получаете полный исходный код с пожизненными обновлениями для создания и запуска неограниченного числа продуктов для себя или клиентов. Вы лишь не можете перепродавать код или распространять репозиторий как стартовый набор или шаблон.

RU