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 ポリシーは機能が提供されてから追加します。

対応状況が変わったら、このページを更新します。

このページの目次