runlot
데이터인증

RLS와 사용자 식별

준비 중

사용자 테이블은 프로젝트 데이터베이스에 저장됩니다. 로그인 사용자를 행 수준 보안(RLS)에 연결하는 기능은 아직 제공하지 않습니다.

현재 가능한 작업

사용자 테이블은 프로젝트 데이터베이스의 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],
);

아직 지원하지 않는 작업

PostgreSQL 행 수준 보안(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
$$;

하지만 현재는 request.jwt.claims 설정값을 채우지 않습니다. 따라서 이 함수는 항상 NULL을 반환합니다. 지금 RLS 정책에서 runlot_auth.uid()를 사용하면 모든 행이 필터링됩니다.

RLS 도입을 준비하는 방법

RLS를 사용할 계획이라면 지금부터 사용자 ID를 저장하는 스키마를 구성할 수 있습니다. 소유자 열은 uuid로 만들고 runlot_auth.users.id를 저장하세요. RLS 정책을 활성화하는 일만 이 기능이 제공된 뒤로 미루면 됩니다.

alter table posts add column owner_id uuid not null;
create index on posts (owner_id);
-- RLS 정책은 기능이 제공된 뒤에 추가합니다.

지원 상태가 바뀌면 이 페이지를 업데이트합니다.

이 페이지의 목차