データ認証
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 ポリシーは機能が提供されてから追加します。対応状況が変わったら、このページを更新します。