如何快速删除具有现有特权的用户

我正在尝试为我的应用程序限制数据库用户,我想放弃 Postgres 数据库用户我正在使用的试验。有没有办法不必首先手动撤销用户的所有权限就可以删除用户,或者撤销用户拥有的所有授权?

189973 次浏览

怎么样

DROP USER <username>

这实际上是 DROP ROLE的别名。

您必须显式删除与该用户相关联的任何特权,还要将其所有权转移到其他角色(或删除对象)。

这最好通过

REASSIGN OWNED BY <olduser> TO <newuser>

还有

DROP OWNED BY <olduser>

后者将删除授予用户的任何特权。

请参阅这里的 放弃角色更详细的描述的 postgres 文档。


附加:

显然,使用这里提到的命令来删除用户只有在连接到原始 GRANTS 所使用的数据库时执行它们才会有效,正如这里所讨论的:

本地 https://www.postgresql.org/message-id/83894a1821034948ba27fe4daa47427928f7c29922%40apde03.apd.satcom

另请注意,如果您已明确授予:

CONNECT ON DATABASE xxx TO GROUP,

您需要使用以下命令从 DROP OWNED BY 中单独撤销该命令:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

我遇到了同样的问题,现在找到了解决它的方法。 首先,必须删除要删除的用户的数据库。然后,用户可以很容易地删除。

我创建了一个名为“ msf”的用户,花了一段时间才删除这个用户并重新创建它。我按照下面的步骤成功了。

1)删除数据库

dropdb msf

2)删除用户

dropuser msf

现在我成功删除了用户。

当我尝试重新设置为所有者或删除为所有者时,接受的答案会导致错误。以下几点对我很有效:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

用户可能在其他模式中拥有特权,在这种情况下,您必须运行适当的 REVOKE 行,并用正确的模式替换“ public”。为了显示用户的所有模式和特权类型,我编辑了 dp 命令来进行以下查询:

SELECT
n.nspname as "Schema",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'S' THEN 'sequence'
WHEN 'f' THEN 'foreign table'
END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

我不确定哪些特权类型对应于对表、序列或函数的撤销,但我认为它们都属于这三种类型中的一种。

我不得不再添加一行 REVOKE..。

跑步后:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

我仍然收到错误: 无法删除 username,因为有些对象依赖于它 DETAIL: schema public 的特权

我错过了这个:

REVOKE USAGE ON SCHEMA public FROM username;

然后我就可以放弃这个角色了。

DROP USER username;

没有 REVOKE ALL PRIVILEGES ON ALL VIEWS,所以我用:

do $$
DECLARE r record;
begin
for r in select * from pg_views where schemaname = 'myschem'
loop
execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
end loop;
end $$;

和往常一样:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

以下各项的成功:

drop role "XUSER";

以下是最终对我奏效的方法:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

在命令行中,有一个命令 dropuser可用于从 postgres 中删除用户。

$ dropuser someuser

这对我很有效:

DROP OWNED BY dbuser

然后:

DROP USER dbuser

这应该会奏效:

REVOKE ALL ON SCHEMA public FROM myuser;
REVOKE ALL ON DATABASE mydb FROM myuser;
DROP USER myuser;

Https://dbtut.com/index.php/2018/07/09/role-x-cannot-be-dropped-because-some-objects-depend-on-it/

经过检查,数据库中没有任何对象的所有权,后来意识到这可能是由于为用户和授予权限创建的外部数据包装映射造成的。

因此需要采取两项行动

  1. 删除用户映射
  2. 撤消对外部数据包装器的使用。

样本查询

删除用户映射到用户名服务器外部服务器名

从用户名中撤销外部服务器上的所有外部服务器名

Postgres 文件对此有一个明确的答案——这是唯一得到批准的答案:

REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;
-- repeat the above commands in each database of the cluster
DROP ROLE doomed_role;

要点:

  1. -- repeat the above commands in each database of the cluster
  2. "it's typically necessary to run both REASSIGN OWNED and DROP OWNED (in that order!) to fully remove the dependencies of a role to be dropped."