Files
mnote/supabase/migrations/20251206_add_lightrag_rls.sql
T

182 lines
6.1 KiB
PL/PgSQL
Raw Normal View History

2025-12-08 19:56:24 +08:00
-- LightRAG namespace → workspace/user 访问控制函数
create or replace function public.lightrag_namespace_is_accessible(namespace text)
returns boolean
language plpgsql
security definer
set search_path = public
as $$
declare
target_workspace uuid;
target_user uuid;
begin
target_user := auth.uid();
if namespace is null or target_user is null then
return false;
end if;
if left(namespace, 5) = 'user_' then
begin
return target_user = substring(namespace from 6 for 36)::uuid;
exception
when others then
return false;
end;
elsif left(namespace, 10) = 'workspace_' then
begin
target_workspace := substring(namespace from 11 for 36)::uuid;
exception
when others then
return false;
end;
return exists (
select 1
from public.workspace_members wm
where wm.workspace_id = target_workspace
and wm.user_id = target_user
);
end if;
return false;
end;
$$;
comment on function public.lightrag_namespace_is_accessible(text)
is '返回 true 表示当前登录用户对指定 LightRAG namespace 有访问权';
grant execute on function public.lightrag_namespace_is_accessible(text)
to authenticated, anon, service_role;
-- LightRAG 相关表启用 RLS 并添加策略
alter table public.lightrag_doc_full enable row level security;
alter table public.lightrag_doc_full force row level security;
create policy lightrag_doc_full_service_role_all
on public.lightrag_doc_full
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_doc_full_workspace_read
on public.lightrag_doc_full
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_doc_chunks enable row level security;
alter table public.lightrag_doc_chunks force row level security;
create policy lightrag_doc_chunks_service_role_all
on public.lightrag_doc_chunks
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_doc_chunks_workspace_read
on public.lightrag_doc_chunks
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_doc_status enable row level security;
alter table public.lightrag_doc_status force row level security;
create policy lightrag_doc_status_service_role_all
on public.lightrag_doc_status
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_doc_status_workspace_read
on public.lightrag_doc_status
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_entity_chunks enable row level security;
alter table public.lightrag_entity_chunks force row level security;
create policy lightrag_entity_chunks_service_role_all
on public.lightrag_entity_chunks
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_entity_chunks_workspace_read
on public.lightrag_entity_chunks
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_full_entities enable row level security;
alter table public.lightrag_full_entities force row level security;
create policy lightrag_full_entities_service_role_all
on public.lightrag_full_entities
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_full_entities_workspace_read
on public.lightrag_full_entities
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_full_relations enable row level security;
alter table public.lightrag_full_relations force row level security;
create policy lightrag_full_relations_service_role_all
on public.lightrag_full_relations
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_full_relations_workspace_read
on public.lightrag_full_relations
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_llm_cache enable row level security;
alter table public.lightrag_llm_cache force row level security;
create policy lightrag_llm_cache_service_role_all
on public.lightrag_llm_cache
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_llm_cache_workspace_read
on public.lightrag_llm_cache
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_relation_chunks enable row level security;
alter table public.lightrag_relation_chunks force row level security;
create policy lightrag_relation_chunks_service_role_all
on public.lightrag_relation_chunks
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_relation_chunks_workspace_read
on public.lightrag_relation_chunks
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_vdb_chunks enable row level security;
alter table public.lightrag_vdb_chunks force row level security;
create policy lightrag_vdb_chunks_service_role_all
on public.lightrag_vdb_chunks
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_vdb_chunks_workspace_read
on public.lightrag_vdb_chunks
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_vdb_entity enable row level security;
alter table public.lightrag_vdb_entity force row level security;
create policy lightrag_vdb_entity_service_role_all
on public.lightrag_vdb_entity
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_vdb_entity_workspace_read
on public.lightrag_vdb_entity
for select using (public.lightrag_namespace_is_accessible(workspace));
alter table public.lightrag_vdb_relation enable row level security;
alter table public.lightrag_vdb_relation force row level security;
create policy lightrag_vdb_relation_service_role_all
on public.lightrag_vdb_relation
using (auth.role() = 'service_role')
with check (auth.role() = 'service_role');
create policy lightrag_vdb_relation_workspace_read
on public.lightrag_vdb_relation
for select using (public.lightrag_namespace_is_accessible(workspace));