We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Мульти‑тенантность в SaaS‑решениях на PHP 8.2 и FastAPI 0.121: изоляция данных, общие модели

Мульти‑тенантность (multi-tenancy) – ключевая особенность современных SaaS (Software as a Service) решений. Она позволяет единому экземпляру приложения обслуживать множество клиентов (тенантов), обеспечивая изоляцию данных и кастомизацию интерфейса. В этой статье мы рассмотрим различные подходы к реализации мульти‑тенантности в приложениях, разработанных на PHP 8.2 и FastAPI 0.121, с особым вниманием к требованиям российского законодательства, в частности, 152-ФЗ «О персональных данных».

Законодательные аспекты и требования к изоляции данных

В России, при работе с персональными данными, необходимо соблюдать 152-ФЗ. Это означает, что данные каждого тенанта должны быть надежно изолированы от данных других тенантов. Это включает в себя не только физическую изоляцию (раздельные базы данных), но и логическую изоляцию (разграничение доступа на уровне приложения). Важно учитывать, что недостаточно просто разделить данные в таблицах одной базы данных – необходимо обеспечить защиту от несанкционированного доступа и предотвратить утечки данных.

Архитектурные подходы к мульти‑тенантности

Существует несколько архитектурных подходов к мульти‑тенантности:

  • Раздельная база данных (Database-per-tenant): Каждый тенант имеет свою собственную базу данных. Это обеспечивает максимальную изоляцию данных, но увеличивает сложность управления и обслуживания.
  • Раздельная схема (Schema-per-tenant): Все тенанты используют одну базу данных, но каждый тенант имеет свою собственную схему. Это компромисс между изоляцией и сложностью управления.
  • Общая база данных, раздельные таблицы (Shared Database, Separate Tables): Все тенанты используют одну базу данных и общие таблицы, но данные каждого тенанта идентифицируются по специальному идентификатору тенанта. Это самый простой подход, но он требует тщательной реализации логики изоляции на уровне приложения.

Реализация мульти‑тенантности на PHP 8.2

Для реализации мульти‑тенантности на PHP 8.2 можно использовать различные фреймворки, такие как Laravel или Symfony. Независимо от фреймворка, необходимо реализовать механизм определения текущего тенанта и фильтрации данных на основе этого идентификатора.

header('X-Tenant-Id'); // Получение ID тенанта из заголовка
        // Валидация tenantId
        if (!$tenantId) {
            return response('Unauthorized', 401);
        }
        // Установка текущего тенанта в контексте приложения
        config(['tenant.id' => $tenantId]);
        return $next($request);
    }
}

//Использование в файле routes/web.php
Route::group(['middleware' => ['tenant']], function () {
    // Все маршруты в этой группе будут выполняться с учетом текущего тенанта
    Route::get('/data', function () {
        // Логика доступа к данным с учетом tenantId
        return 'Data for tenant ' . config('tenant.id');
    });
});

Важно помнить о необходимости экранирования входных данных и использования подготовленных запросов для предотвращения SQL-инъекций, особенно при работе с общими базами данных.

Реализация мульти‑тенантности на FastAPI 0.121

FastAPI позволяет реализовать мульти‑тенантность с помощью зависимостей (dependencies). Можно создать зависимость, которая определяет текущего тенанта и использует его для фильтрации данных.

from fastapi import FastAPI, Depends, Header, HTTPException
from typing import Optional

app = FastAPI()

# Глобальная переменная для хранения текущего tenant_id
g_current_tenant_id: Optional[str] = None

async def get_tenant_id(tenant_id: str = Header(...)):
    global g_current_tenant_id
    # Валидация tenant_id
    if not tenant_id:
        raise HTTPException(status_code=401, detail="Tenant ID is required")
    g_current_tenant_id = tenant_id
    return tenant_id

@app.get("/data")
async def read_data(tenant_id: str = Depends(get_tenant_id)):
    # Логика доступа к данным с учетом tenant_id
    return {"message": f"Data for tenant {tenant_id}"}

В FastAPI также можно использовать middleware для обработки заголовков запросов и установки текущего тенанта.

Общие модели и изоляция данных

При использовании общих моделей необходимо обеспечить изоляцию данных на уровне запросов к базе данных. Это можно сделать с помощью добавления столбца tenant_id ко всем таблицам и фильтрации данных по этому столбцу в каждом запросе. Использование ORM (Object-Relational Mapper) может упростить эту задачу, предоставляя механизмы для автоматической фильтрации данных.

Выбор оптимального подхода

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

Заключение

Реализация мульти‑тенантности в SaaS-приложениях – сложная задача, требующая тщательного планирования и реализации. Необходимо учитывать не только технические аспекты, но и требования российского законодательства, в частности, 152-ФЗ. Правильный выбор архитектурного подхода и использование современных технологий, таких как PHP 8.2 и FastAPI 0.121, позволит создать надежное и безопасное SaaS-решение.

РыбинскЛАБ предоставляет полный спектр услуг по разработке SaaS-приложений, включая проектирование архитектуры, реализацию мульти‑тенантности, интеграцию с внешними системами и обеспечение соответствия требованиям законодательства. Мы поможем вам создать масштабируемое и безопасное решение, отвечающее всем вашим потребностям. Свяжитесь с нами для обсуждения вашего проекта: https://рыбинсклаб.рф

Материал подготовлен и отредактирован для практического применения. Перед внедрением в продакшен проверьте код и команды на своём окружении.

Поделиться материалом

Нужна сложная backend-разработка?

Проектирование архитектуры, PHP/Python backend, интеграции API, боты, автоматизация и оптимизация существующих систем.

Обсудить проект
Поддержать проект