内容提要
Postgres提供了强大而灵活的权限模型来控制对数据的访问。角色和权限用于管理对数据库对象的访问。对象有所有者可以授予其他角色权限。可以为未来的对象设置默认访问权限。超级用户角色可以绕过所有权限检查。公共角色是所有其他角色的默认角色。理解这些概念对于有效的数据库管理非常重要。
延伸解读
所有者权限与授权限制
在Postgres中,每个对象都有所有者,所有者拥有对象的全部权限,可以修改、删除对象或授予其他角色权限。非所有者角色即使拥有管理权限(如Supabase中的postgres角色),若未被授予特定权限,也无法直接操作对象。例如,postgres角色无法为表授予select权限,因为它既不是所有者也没有相应权限。因此,管理权限时需明确所有者身份,并通过所有者或具有grant option的角色进行授权。
默认权限与组角色管理
默认访问权限允许为未来创建的对象自动授予特定权限,避免每次手动授权。例如,通过alter default privileges设置后,junior_dev创建的新表会自动授予senior_dev select权限。此外,使用组角色可以简化权限管理:将对象所有权赋予组,用户通过成为组成员继承权限。这样,新用户只需加入组即可获得一致权限,无需逐个对象授权。
public角色的隐式权限与撤销陷阱
public角色是所有角色的默认成员,提供connect、temporary、execute和usage等常见权限。撤销权限时需注意:即使从特定角色撤销了权限,该角色仍可能通过public角色继承权限。例如,撤销junior_dev对函数的execute权限后,它仍能执行,因为public角色默认拥有execute权限。必须同时从public角色撤销,才能彻底禁止。此外,撤销不存在的权限时Postgres不会警告,建议操作后显式检查权限。
超级用户与角色属性
超级用户角色绕过所有权限检查(登录认证除外),权力极大,应谨慎使用。只有超级用户可以创建其他超级用户。角色属性控制角色行为,如login(能否登录)、superuser(是否超级用户)、createdb(能否创建数据库)、createrole(能否创建角色)、replication(能否复制)、bypassrls(能否绕过行级安全)、connection limit(连接数限制)和inherit(能否继承权限)。合理配置这些属性有助于精细控制数据库访问。
Q&A
Postgres中的角色和权限模型是如何工作的?
Postgres提供了基于对象、权限和角色的权限模型,允许用户管理对数据库对象的访问。每个对象都有一个所有者,所有者可以授予其他角色权限。
如何在Postgres中创建用户角色?
可以使用psql命令行工具,通过命令'create role <角色名> login password <密码>'来创建用户角色。
什么是超级用户角色,它的作用是什么?
超级用户角色可以绕过所有权限检查,具有极高的权限,通常用于数据库管理,但使用时需谨慎。
如何管理Postgres中的权限?
权限管理通过授予和撤销权限来实现,可以使用'grant'和'revoke'命令来控制角色对数据库对象的访问。
Postgres中如何设置默认访问权限?
可以使用'alter default privileges in schema <schema> grant <权限> on <对象> to <角色>'命令来设置默认访问权限,以便未来创建的对象自动授予特定权限。
在Postgres中,如何创建用户组以简化权限管理?
可以通过'create role <组名> nologin'命令创建用户组,然后使用'grant <组名> to <用户>'将用户添加到该组,以便他们可以共享权限。