在 PostgreSQL 15 中,发生了一个与碰巧使用权限的每个用户相关的根本性变化:公共模式的默认权限已被修改。这是相关的,因为它可能会在应用程序部署期间伤害您。您需要了解它对您的影响。
目录
创建用户
许多人只作为超级用户工作。不建议这样做运行时错误没有权限,可能会导致严重的安全问题。建议创建单独的用户来运行您的应用程序。在 PostgreSQL 中运行时错误没有权限,您可以使用或命令创建新用户。这两个选项之间的区别在于直接设置权限而将此属性设置为。在此示例中,您将创建一个“演示”用户,如下清单所示:CREATE USER``CREATE ROLE``CREATE USER``LOGIN``CREATE ROLE``NOLOGIN
security=# CREATE USER demo LOGIN;
CREATE ROLE
完成后,您可以重新连接到数据库。\c如果您碰巧使用 psql,该命令是执行此操作的好方法。如果您正在运行其他工具,请使用新用户重新连接:
security=# \c security demo
You are now connected to database "security" as user "demo".
security=> SELECT current_user;
current_user
--------------
demo
(1 row)
“current_user” 将返回当前使用的用户。
在 PostgreSQL 15 中使用 PUBLIC 模式
在 PostgreSQL 14 和之前的版本中,创建表是可能的。新表将简单地以公共模式结束,一切都会很好。这种方法的问题在于,公共模式会很快变成一个包含各种已用和未用表的垃圾桶——这既不可取也不推荐。因此 PostgreSQL 取得了重大飞跃并改变了这种行为。
查看以下清单
ecurity=> CREATE TABLE foo (id int);
ERROR: permission denied for schema public
LINE 1: CREATE TABLE foo (id int);
PostgreSQL 会出错并告诉您您没有权限在公共模式中创建某些内容,而无需事先明确指定允许谁这样做。现在有必要明确地向用户授予权限。它是这样工作的:
security=> \c security postgres
You are now connected to database "security" as user "postgres".
security=# GRANT ALL ON SCHEMA public TO demo;
GRANT
让我们以超级用户身份连接到 PostgreSQL 并设置USAGE + CREATE = ALL对公共模式的权限。完成后,您可以继续在此模式中创建对象:
security=# \c security demo
You're now connected to database "security" as user "demo".
security=> CREATE TABLE foo (id int);
CREATE TABLE
该表将属于创建该表的“demo”用户:
security=> \d
List of relations
Schema | Name | Type | Owner
-------+------+-------+-------
public | foo | table | demo
(1 row)
最后
如果您想了解有关 PostgreSQL 的更多信息,并且您碰巧对一般安全性感兴趣,那么在 PostgreSQL 中使用 SSL 加密客户端/服务器连接是没有办法的。我创建了一篇关于这个重要主题的博文并邀请您阅读()。
原文标题:POSTGRESQL ERROR: PERMISSION DENIED FOR SCHEMA PUBLIC
版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。
发表评论