postgresql – 连接到数据库后切换角色

postgresql – 连接到数据库后切换角色,第1张

概述是否可以更改用户在初始连接后与postgres进行交互时使用的postgresql角色数据库将在Web应用程序中使用,我想对连接池的表和模式使用数据库级规则。从阅读postgresql文档,我似乎可以切换角色,如果我最初作为一个用户与超级用户角色连接,但我宁愿最初连接作为一个用户具有最小的权限,并根据需要切换。在切换时必须指定用户的密码会很好(事实上我更喜欢它)。 我缺少什么? 更新:我尝试了 是否可以更改用户在初始连接后与postgres进行交互时使用的postgresql角色?

数据库将在Web应用程序中使用,我想对连接池的表和模式使用数据库级规则。从阅读postgresql文档,我似乎可以切换角色,如果我最初作为一个用户与超级用户角色连接,但我宁愿最初连接作为一个用户具有最小的权限,并根据需要切换。在切换时必须指定用户的密码会很好(事实上我更喜欢它)。

我缺少什么?

更新:我尝试了SET RolE和SET SESSION AUTHORIZATION,如@Milen建议的,但如果用户不是超级用户,这两个命令似乎都不工作:

$ psql -U testpsql (8.4.4)Type "help" for help.test=> \du test          List of roles Role name | Attributes |   Member of    -----------+------------+---------------- test      |            | {connect_only}test=> \du test2          List of roles Role name | Attributes |   Member of    -----------+------------+---------------- test2     |            | {connect_only}test=> set role test2;ERROR:  permission denIEd to set role "test2"test=> \q
--create a user that you want to use the database as:create role neil;--create the user for the web server to connect as:create role webgui noinherit login password 's3cr3t';--let webgui set role to neil:grant neil to webgui; --this looks backwards but is correct.

webgui现在在neil组中,所以webgui可以调用set role neil。但是,webgui没有继承neil的权限。

后来,登录为webgui:

psql -d some_database -U webgui(enter s3cr3t as password)set role neil;

webgui不需要超级用户权限。

您希望在数据库会话开始时设置角色,并在会话结束时将其重置。在Web应用程序中,这对应于从数据库连接池获取连接并释放它。这里有一个使用Tomcat的连接池和Spring Security的例子:

public class SetRoleJdbcInterceptor extends JdbcInterceptor {    @OverrIDe    public voID reset(ConnectionPool connectionPool,PooledConnection pooledConnection) {        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();        if(authentication != null) {            try {                /*                   use Owasp's ESAPI to encode the username to avoID sql Injection. Can't use parameters with SET RolE. Need to write PG codec.                  Or use a whiteList-map approach                */                String username = ESAPI.encoder().encodeForsql(MY_CODEC,authentication.getname());                Statement statement = pooledConnection.getConnection().createStatement();                statement.execute("set role \"" + username + "\"");                statement.close();            } catch(sqlException exp){                throw new RuntimeException(exp);            }        }    }    @OverrIDe    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {        if("close".equals(method.getname())){            Statement statement = ((Connection)proxy).createStatement();            statement.execute("reset role");            statement.close();        }        return super.invoke(proxy,method,args);    }}
总结

以上是内存溢出为你收集整理的postgresql – 连接到数据库后切换角色全部内容,希望文章能够帮你解决postgresql – 连接到数据库后切换角色所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1171720.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存