Postgresql postgres中的角色、组和设置会话授权

Postgresql postgres中的角色、组和设置会话授权,postgresql,row-level-security,Postgresql,Row Level Security,我正在研究postgres多租户应用程序的行级安全性。我希望通过一个策略来实现这一点,该策略基于租户名称(表中的一列)分隔行。我对每个租户都有角色。但是,我通过超级用户通过连接来维护连接池。这样,我只能有一个连接池。一旦我从一个租户那里得到了一个查询,我想先删除该租户的特权,然后执行查询 因此,我以超级用户的身份连接到数据库,然后执行“设置会话授权租户角色”。这将设置会话用户和当前用户变量。但是,问题是,这个租户用户可以自己执行“设置会话授权给其他租户”,然后行安全性就无关紧要了。我猜这是因为D

我正在研究postgres多租户应用程序的行级安全性。我希望通过一个策略来实现这一点,该策略基于租户名称(表中的一列)分隔行。我对每个租户都有角色。但是,我通过超级用户通过连接来维护连接池。这样,我只能有一个连接池。一旦我从一个租户那里得到了一个查询,我想先删除该租户的特权,然后执行查询

因此,我以超级用户的身份连接到数据库,然后执行“设置会话授权租户角色”。这将设置会话用户和当前用户变量。但是,问题是,这个租户用户可以自己执行“设置会话授权给其他租户”,然后行安全性就无关紧要了。我猜这是因为DB登录上下文是超级用户

那么我该如何实现这一点呢?一旦我对某个用户执行“设置会话授权”或“设置角色”,该用户就不能再次运行相同的操作

感谢您的回答,您可能需要阅读

本质上,创建一个无特权用户并通过该用户登录到池(而不是作为主管角色的连接池)。登录后,将角色升级到实际连接的用户。上面的URL告诉您如何做到这一点


我无法理解的是,如果这是一个不受控制的环境,那么即使使用此解决方案,用户也可以升级到其他人的角色,仍然会造成严重破坏。因此,即使这回答了问题,它也可能不是你最终想要做的

谢谢@Robins,这很有帮助。你最后提到的事实上是正确的。但你所说的“不受控制的环境”到底是什么意思呢。如何放置控件?既然您提到了这个
,该租户用户可以自己执行“设置会话授权给其他租户”
,我假设这不是一个完全受控的环境,因此你必须最大程度地偏执。受控环境是一个你可以确保0%的用户会在0%的时间内进行这种用户升级的环境。既然你不能确定。。。然后这是一个不受控制的环境(我总是想象Netflix的混乱猴子在破坏我的数据库:)():)