Postgres 角色管理
管理对 Postgres 数据库的访问权限及配置授权
Postgres 使用角色(role)的概念来管理数据库访问权限。通常您不会在自己的应用中使用这些角色——它们主要用于配置数据库的_系统访问_权限。如果您想配置_应用访问_权限,则应使用行级安全(RLS)。您还可以在RLS基础上实现基于角色的访问控制。
用户与角色
在Postgres中,角色既可以作为用户(user)也可以作为用户组(group)。用户是具有登录权限的角色,而用户组(也称为角色组)是没有登录权限的角色,但可用于管理多个用户的权限。
创建角色
您可以使用create role
命令创建角色:
1create role "role_name";
创建用户
在Postgres中,角色和用户本质上是相同的,但如果您想为特定角色使用密码登录,可以使用WITH LOGIN PASSWORD
:
1create role "role_name" with login password 'extremely_secure_password';
密码安全
您的Postgres数据库是Supabase项目的核心,因此确保每个角色始终使用强密码至关重要。以下是创建安全密码的一些建议:
- 使用密码管理器生成密码
- 设置长密码(至少12个字符)
- 不要使用常见字典单词
- 混合使用大小写字母、数字和特殊符号
密码中的特殊符号
如果在Postgres密码中使用特殊符号,后续使用Postgres连接字符串时必须记得进行百分号编码,例如:postgresql://postgres.projectref:p%3Dword@aws-0-us-east-1.pooler.supabase.com:6543/postgres
修改项目密码
创建项目时,系统会要求您设置一个密码。这是数据库中postgres
角色的密码。您可以在仪表板的数据库设置页面更新此密码。切勿将此密码提供给第三方服务,除非您完全信任他们。我们建议为每个需要访问权限的服务创建单独的用户。这种做法也有助于调试——您可以在pg_stat_statements
中查看每个角色在数据库中执行的所有查询。
修改密码不会导致任何服务中断。所有已连接的服务(如PostgREST、PgBouncer和其他Supabase托管服务)都会自动更新使用最新密码以确保可用性。但如果您有任何外部服务使用硬编码的用户名/密码凭证连接Supabase数据库,则需要手动更新这些服务的凭证。
授予权限
可以使用GRANT
命令为角色授予数据库对象的各种权限。权限包括SELECT
、INSERT
、UPDATE
和DELETE
等。您可以配置对数据库中几乎所有对象的访问权限——包括表、视图、函数和触发器。
撤销权限
可以使用REVOKE
命令撤销权限:
1REVOKE permission_type ON object_name FROM role_name;
角色层级
角色可以组织成层级结构,其中一个角色可以继承另一个角色的权限。这简化了权限管理,因为您可以在更高层级定义权限,这些权限会自动应用于所有子角色。
角色继承
要创建角色层次结构,首先需要创建父角色和子角色。子角色将从其父角色继承权限。创建角色时可以使用 INHERIT 选项添加子角色:
1create role "child_role_name" inherit "parent_role_name";
阻止继承
在某些情况下,您可能希望阻止角色建立父子关系(通常是超级用户角色)。可以使用 NOINHERIT
来阻止继承关系:
1alter role "child_role_name" noinherit;
Supabase 角色
Postgres 自带一组预定义角色。Supabase 在此基础上扩展了一套默认角色,这些角色在您启动新项目时会自动配置到数据库中:
postgres
默认的 Postgres 角色,拥有管理员权限。
anon
用于未经认证的公共访问。当用户_未_登录时,API (PostgREST) 将使用此角色。
authenticator
API (PostgREST) 的特殊角色。它拥有非常有限的权限,用于验证 JWT 然后"切换"到由 JWT 验证决定的其他角色。
authenticated
用于"认证访问"。当用户_已_登录时,API (PostgREST) 将使用此角色。
service_role
用于提升权限访问。API (PostgREST) 使用此角色绕过行级安全策略。
supabase_auth_admin
由 Auth 中间件使用,用于连接数据库并运行迁移。访问权限仅限于 auth
模式。
supabase_storage_admin
由 Auth 中间件使用,用于连接数据库并运行迁移。访问权限仅限于 storage
模式。
dashboard_user
用于通过 Supabase UI 执行命令。
supabase_admin
Supabase 用于管理任务的内部角色,例如运行升级和自动化操作。