PostgeSQL 的代理身份验证

bel*_*daz 4 postgresql authentication jdbc connections

以下似乎可能是一种相当普遍的情况,但我还没有看到任何解决方案。

我有一个 PostgreSQL 数据库,其中包含特定于 的视图,$user以便根据某些特定于数据库的 ACL 逻辑来限制数据。数据库通常通过 JDBC 访问,特别是在 Web 界面的 JSP 中。用户通过 LDAP 密码认证登录网站。

我想要的是利用从 JDBC 连接到数据库的视图。但通常这个中间层连接是使用通用用户创建的,而不是特定于登录网站的人。我相信在 Oracle 中“正确”的方法是Proxy Authentication,但 AFAIAA 没有与 PostgreSQL 等效的方法。那么该怎么做呢?

想到了一些想法:

  • 给所有用户的数据库帐户设置相同的密码,然后使用这个通用密码创建特定于用户的 JDBC 连接(这感觉太不对了……)
  • 将用户的登录密码存储在网站某处,在创建数据库连接时重复使用(再次,这个感觉很错误)

还有其他(希望更好)的建议吗?

Cra*_*ger 5

通常的解决方案是在 Web 应用程序中对用户进行身份验证,然后在已使用固定用户名通过数据库进行身份验证的 JDBC 会话上发出SET ROLESET SESSION AUTHORIZATION以“成为”用户。

在这两种情况下DISCARD ALL,任何连接池在将连接返回到池时应该运行的命令将自动重置授权。确保您的连接池DISCARD ALL在返回的连接上运行

这些很像链接的 Oracle 文档中给出的三个“代理身份验证”案例中的第一个。

PostgreSQL 不支持其他两种形式,其中客户端身份验证传递到数据库。支持相对简单,但没有人希望它足以实施它或资助其他人实施它所需的工作。

SET ROLE

要使用,SET ROLE您必须以具有所有用户角色成员身份的用户身份连接到数据库,但该用户可以没有特权。DB 用户应该在时间NOINHERIT设置ALTER ROLE或设置选项CREATE ROLE。因此,您通常将 webapp 用户创建为 webapp 用户所属的 db 角色,例如

CREATE ROLE newusername 
  NOLOGIN
  ROLE mywebappuser;
Run Code Online (Sandbox Code Playgroud)

ROLE mywebapp相当于运行后续GRANT newusername TO mywebappuser;)。

SET SESSION AUTHORIZATION

要使用,SET SESSION AUTHORIZATION您必须以超级用户身份连接,这通常是不可取的,因为它将完全控制权交给 webapp 用户。

不像SET ROLE没有组成员资格的要求。