SecurityDatabase

Организация многоарендного доступа с помощью Supabase RLS

·MAGMA

Основы использования Supabase RLS

Row Level Security (RLS) от Supabase позволяет устанавливать правила доступа непосредственно на уровне базы данных при помощи политик SQL. Если всё сделано правильно, вашему приложению не потребуется явно проверять разрешения.

Основные шаги:

ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
CREATE POLICY "own_tasks_select" ON tasks FOR SELECT USING (user_id = auth.uid());
CREATE POLICY "own_tasks_insert" ON tasks FOR INSERT WITH CHECK (user_id = auth.uid());

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

Многоарендный доступ на основе организаций

Для реализации многоарендной архитектуры можно использовать таблицы organizations и organization_members, где каждая организация имеет своих членов с определёнными ролями (owner, admin, member).

CREATE TABLE organizations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name TEXT NOT NULL,
    slug TEXT UNIQUE NOT NULL
);

CREATE TABLE organization_members (
    org_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
    user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
    role TEXT NOT NULL CHECK (role IN ('owner', 'admin', 'member')),
    PRIMARY KEY (org_id, user_id)
);

Затем создаются дополнительные таблицы, такие как проекты, связанные с организациями:

CREATE TABLE projects (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    org_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
    name TEXT NOT NULL
);

Политики доступа позволяют читать данные всем членам организации, но писать – только владельцам или администраторам:

-- Чтение доступно любому члену организации
CREATE POLICY "org_projects_select" ON projects FOR SELECT USING (org_id IN (SELECT my_org_ids()));

-- Запись доступна только владельцу или администратору
CREATE POLICY "org_projects_write" ON projects FOR INSERT WITH CHECK (
    EXISTS (
        SELECT 1 FROM organization_members
        WHERE org_id = projects.org_id AND user_id = auth.uid() AND role IN ('owner', 'admin')
    )
);

Оптимизация производительности с использованием JWT-клаимов

Запрос к таблице organization_members на каждой строке может замедлить работу приложения. Для ускорения рекомендуется встраивать идентификаторы организаций прямо в JWT-токен пользователя.

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

Вернуться к блогу
Многоарендный доступ через Supabase RLS — MAGMA