runlot
데이터인증

RLS 와 신원

준비 중

가입자 표는 여러분의 DB 안에 있습니다. 행 수준 보안에 신원을 잇는 배선은 아직입니다.

지금 되는 것

가입자 표는 프로젝트 데이터베이스의 runlot_auth 스키마에 있습니다. 감춰 두지 않았으니 조인해서 쓰시면 됩니다.

select p.id, p.title, u.email
from posts p
join runlot_auth.users u on u.id = p.owner_id
order by p.id desc
limit 20;

권한은 워커 코드에서 확인하시는 것이 지금의 방식입니다.

const user = await env.auth.user(request);
if (!user) return new Response(null, { status: 401 });

const rows = await env.db.exec(
  "select id, title from posts where owner_id = $1 order by id desc limit 20",
  [user.id],
);

아직 안 되는 것

데이터베이스의 행 수준 보안(RLS)이 로그인한 사용자를 알아보게 하는 배선은 아직 없습니다.

runlot_auth.uid() 함수는 이미 만들어져 있습니다.

create or replace function runlot_auth.uid() returns uuid language sql stable as $$
  select (nullif(current_setting('request.jwt.claims', true), '')::json->>'sub')::uuid
$$;

다만 그 설정값을 채우는 코드가 아직 없어서, 지금 이 함수는 언제나 NULL 을 돌려줍니다. 이 상태에서 RLS 정책을 runlot_auth.uid() 위에 세우시면 모든 행이 걸러집니다.

지금 무엇을 하실 수 있나요

RLS 를 쓰실 계획이라면 스키마는 미리 그렇게 두셔도 됩니다 — 소유자 컬럼을 uuid 로 두고 runlot_auth.users.id 를 담으세요. 정책을 켜는 것만 배선이 붙은 뒤로 미루시면 됩니다.

alter table posts add column owner_id uuid not null;
create index on posts (owner_id);
-- 정책은 나중에

진행 상황은 이 페이지에서 갱신합니다.

이 페이지에서