次はかなり一般的な状況のようですが、解決策は見ていません。
一部のデータベース固有のACLロジックに応じてデータを制限するために、$user
に固有のビューを含むPostgreSQLデータベースがあります。データベースは通常、JDBCを介してアクセスされ、特にWebインターフェースのJSPではアクセスされます。ユーザーはLDAPを使用したパスワード認証でWebサイトにログインします。
私が望むのは、データベースへのJDBC接続内からビューを利用することです。ただし、通常、この中間層接続は、Webサイトにログインしているユーザーに固有のものではなく、一般的なユーザーを使用して作成されます。 Oracleでは「正しい」アプローチは プロキシ認証 であると思いますが、AFAIAAにはPostgreSQLに相当するものはありません。代わりに何をすべきか?
いくつかのアイデアが思い浮かびます:
他の(うまくいけば)提案はありますか?
通常の解決策は、Webアプリ内でユーザーを認証し、SET ROLE
またはSET SESSION AUTHORIZATION
を発行して、固定ユーザー名を使用してデータベースですでに認証されているJDBCセッションでユーザーになることです。
どちらの場合も、接続をプールに戻すときに接続プールによって実行されるDISCARD ALL
コマンドは、認証を自動的にリセットします。 返された接続で接続プールがDISCARD ALL
を実行していることを確認してください。
これらは、リンクされたOracleドキュメントに記載されている3つの「プロキシ認証」の最初のケースとよく似ています。
PostgreSQLは、クライアント認証がDBに渡される他の2つの形式をサポートしていません。サポートは比較的簡単ですが、それを実装したり、他の誰かが実装するために必要な作業に資金を供給したりすることを望んでいる人はいません。
SET ROLE
SET ROLE
を使用するには、すべてのユーザーロールのメンバーシップを持つユーザーとしてDBに接続する必要がありますが、それ以外の場合はユーザーに権限がない可能性があります。 DBユーザーは、NOINHERIT
オプションをALTER ROLE
で、またはCREATE ROLE
に設定する必要があります。そのため、通常は、webappユーザーが所属するdbロールとしてwebappユーザーを作成します。
CREATE ROLE newusername
NOLOGIN
ROLE mywebappuser;
(ROLE mywebapp
は、後続のGRANT newusername TO mywebappuser;
を実行するのと同じです)。
SET SESSION AUTHORIZATION
SET SESSION AUTHORIZATION
を使用するには、スーパーユーザーとして接続する必要があります。これは、webappユーザーに完全な制御を与えるため、通常は望ましくありません。
SET ROLE
とは異なり、グループメンバーシップの要件はありません。