在下面的代码片段中,该角色writer
是名为 的超级用户角色的成员admin
。admin
角色可以将行插入到表中,但角色writer
不能将行插入到同一个表中。为什么writer
角色不继承超级用户角色的权限admin
?
CREATE TABLE test_check_roles( id SERIAL NOT NULL );
CREATE ROLE admin SUPERUSER LOGIN;
-- Insert succeeds as the admin role.
SET ROLE admin;
INSERT INTO test_check_roles (id) VALUES (DEFAULT);
-- Insert fails as the writer role with:
-- ERROR: permission denied for table test_check_roles
CREATE ROLE writer LOGIN INHERIT;
GRANT admin TO writer;
SET ROLE writer;
INSERT INTO test_check_roles (id) VALUES (DEFAULT);
根据下面的文档(Postgres 12 - Role Membership),我希望writer
拥有用户的所有权限,admin
因为作者角色具有 INHERIT 标签。
具有 INHERIT 属性的成员角色自动使用其所属角色的权限,包括这些角色继承的任何权限。
可重现的例子
docker run --name pg-test -d --rm \
--env POSTGRES_HOST_AUTH_METHOD=trust \
-p 54321:5432 \
postgres:12.2
psql -h localhost -p 54321 -U postgres -d postgres \
-c "CREATE TABLE test_check_roles( id SERIAL NOT NULL )" \
-c "CREATE ROLE admin SUPERUSER LOGIN" \
-c "SET ROLE admin" \
-c "INSERT INTO test_check_roles (id) VALUES (DEFAULT)" \
-c "CREATE ROLE writer LOGIN INHERIT" \
-c "GRANT admin TO writer" \
-c "SET ROLE writer" \
-c "INSERT INTO test_check_roles (id) VALUES (DEFAULT)"
docker stop pg-test
相关问题
- Postgres 角色权限问题:与
ALTER DEFAULT PRIVILEGES
. - 为什么允许新用户创建表?- 有一个很好的答案来描述特权不是等级的。
观察
如果我CREATE TABLE
以管理员角色而不是 postgres 角色运行,则该示例有效。似乎权限在postgres
拥有表、admin
拥有超级用户和writer
成为管理员成员之间丢失了。我不明白为什么postgres
角色创建的表可以通过admin
by not by访问writer
。
超级用户不继承;它是角色的属性而不是权限。
见https://www.postgresql.org/docs/current/role-membership.html