以下似乎是一个相当普遍的情况,但我还没有看到任何解决方案。
我有一个 PostgreSQL 数据库,其中包含特定于 的视图,$user
以便根据某些特定于数据库的 ACL 逻辑来限制数据。数据库通常通过 JDBC 访问,特别是在 JSP 中用于 Web 界面。用户使用 LDAP 使用密码验证登录网站。
我想要的是利用从 JDBC 连接到数据库的视图。但通常这种中间层连接是使用通用用户创建的,而不是特定于登录网站的人。我相信在 Oracle 中,“正确”的方法是Proxy Authentication,但 AFAIAA 没有 PostgreSQL 的等价物。那么该怎么做呢?
一些想法浮现在脑海:
- 为所有用户的数据库帐户提供相同的密码,然后使用这个通用密码创建用户特定的 JDBC 连接(这感觉太不对劲了……)
- 将用户的登录密码存储在网站的某处,以便在创建数据库连接时重复使用(再次,这感觉非常错误)
还有其他(希望是更好的)建议吗?
通常的解决方案是在 Web 应用程序中对用户进行身份验证,然后在已使用固定用户名通过数据库进行身份验证的 JDBC 会话上发出
SET ROLE
或SET SESSION AUTHORIZATION
“成为”用户。在这两种情况下
DISCARD ALL
,任何连接池在将连接返回到池时都应运行的命令将自动重置授权。确保您的连接池DISCARD ALL
在返回的连接上运行。这些很像链接的 Oracle 文档中给出的三个“代理身份验证”案例中的第一个。
PostgreSQL 不支持其他两种形式,其中客户端身份验证被传递到数据库。支持相对简单,但没有人想要它来实施它或资助其他人实施它所需的工作。
SET ROLE
要使用
SET ROLE
,您必须以具有所有用户角色成员身份的用户身份连接到数据库,但该用户可以是非特权用户。DB 用户应该在时间NOINHERIT
设置ALTER ROLE
或设置选项CREATE ROLE
。因此,您通常将 webapp 用户创建为 webapp 用户所属的 db 角色,例如(
ROLE mywebapp
相当于运行后续GRANT newusername TO mywebappuser;
)。SET SESSION AUTHORIZATION
要使用
SET SESSION AUTHORIZATION
,您必须以超级用户身份连接,这通常是不可取的,因为它将完全控制权交给了 webapp 用户。不像
SET ROLE
对组成员身份没有要求。