我想撤销管理员或执行功能的一个特定的用户在Postgres在用户创建的java。
例如,让我们有一个只读权限的用户“readonlyuser”,我不想让他执行这些函数,所以我在下面尝试撤销,首先是所有函数,然后是pg_sleep。
从只读用户,public撤消对函数的执行;
调用函数时执行pg_sleep FROM只读用户;
如下所述,
String sql = "CREATE USER 'readonlyuser' WITH ENCRYPTED PASSWORD 'pass';";
Statement stmt = connection.createStatement();
stmt.execute(sql);
stmt.execute("REVOKE EXECUTE ON FUNCTIONS FROM 'readonlyuser', public");
or
stmt.execute("REVOKE EXECUTE ON FUNCTION pg_sleep FROM readonlyuser;");
但是,我仍然可以从readonlyuser执行函数.
请帮助我知道我怎样才能做到这一点。
1条答案
按热度按时间k4ymrczo1#
REVOKE EXECUTE ON FUNCTIONS
不是正确的SQL,所以让我以pg_sleep
为例。pg_sleep
具有默认权限,因为返回NULL。The documentation具有该值
授予
PUBLIC
的默认权限如下:[...]函数和过程的EXECUTE
特权因此,特权被授予
PUBLIC
,现在您只能撤消已授予的特权,因此,从readonlyuser
撤消特权的尝试将一无所获,您必须从PUBLIC
撤消特权。请注意,您不应更改系统功能的权限。此类更改将在升级过程中丢失。此外,它可能会破坏预期能够使用这些功能的客户端工具。请注意,被视为危险的功能仅限于特权用户。
如果您的目标是防止可以在数据库上运行SQL语句的用户执行拒绝服务攻击,那么就别想了。这是不可能的。在这种情况下,限制对某些函数的访问是您最不需要担心的。不要让不可信的用户在数据库上运行自己的SQL语句。