在 Rails 控制台中删除用户

我们使用 SSO 让在主网站已通过身份验证的用户登录。

其中一位用户在登录时收到错误提示,建议她联系管理员。我们尝试搜索她的账户,但找不到她的个人资料。

我做了当时能想到的第一件事:通过命令行“删除”了她

 User.find_by(email: "ex@example.com").delete

但这并不明智,实际上也并未生效。当她再次尝试登录时,仍然遇到同样的错误。现在她的个人资料确实存在(无法通过搜索找到,但可以通过 URL 访问),但没有电子邮件、盐值或密码哈希。

我该如何彻底清除她在系统中的记录,以便她能够重新登录?

非常欢迎任何建议。

以下是通过 user.find_by 搜索到的个人资料信息:

id: 1541,
 username: "anon.nymus",
 created_at: Tue, 15 May 2018 17:25:11 UTC +00:00,
 updated_at: Sun, 02 Feb 2020 07:00:59 UTC +00:00,
 name: "Anon Nymus",
 seen_notification_id: 29204,
 last_posted_at: Mon, 28 May 2018 17:42:14 UTC +00:00,
 password_hash: nil,
 salt: nil,
 active: false,
 username_lower: "anon.nymus",
 last_seen_at: Thu, 17 May 2018 19:55:26 UTC +00:00,
 admin: false,
 last_emailed_at: Sun, 02 Feb 2020 07:01:07 UTC +00:00,
 last_emailed_at: Sun, 02 Feb 2020 07:01:07 UTC +00:00,
 trust_level: 2,
 approved: false,
 approved_by_id: nil,
 approved_at: nil,
 previous_visit_at: Wed, 16 May 2018 18:21:47 UTC +00:00,
 suspended_at: nil,
 suspended_till: nil,
 date_of_birth: nil,
 views: 0,
 flag_level: 0,
 ip_address: #################
 moderator: false,
 title: nil,
 uploaded_avatar_id: nil,
 locale: nil,
 primary_group_id: 49,
 registration_ip_address: nil,
 staged: false,
 first_seen_at: Tue, 15 May 2018 17:26:19 UTC +00:00,
 silenced_till: nil,
 group_locked_trust_level: nil,
 manual_locked_trust_level: nil,
 secure_identifier: nil>
1 个赞

您应该使用 UserDestroyer 来正确删除用户。类似以下的代码应该可以工作:

UserDestroyer.new(Discourse.system_user).destroy(User.find_by_username_or_email("ex@example.com"), delete_posts: false)

这将使系统用户删除邮箱为 ex@example.com 的用户。您也可以提供用户名而不是邮箱。

如果您希望日志中显示是谁删除了该用户,请将 Discourse.system_user 替换为 User.find_by_username_or_email("admin@example.com"),其中 admin@example.com 是站点管理员的邮箱。

2 个赞

你好,Joshua,感谢你的快速回复。

不幸的是,这导致了一个错误:

UserDestroyer::PostsExistError: UserDestroyer::PostsExistError
from /var/www/discourse/app/services/user_destroyer.rb:18:in `destroy'

注意:由于邮箱已被我误删,我使用了用户名而不是邮箱来查找用户。

好的,这意味着您尝试删除的用户已有帖子:PostsExistError

建议的解决方法是查看该用户的帖子,并逐个删除,以防其中有任何您希望保留的帖子(可通过更改用户来实现)。请记住,删除主题中的第一篇帖子也会删除整个主题。

“直接执行”的方法是将 delete_posts: false 改为 delete_posts: true

1 个赞

我看到了这个错误。我通过用户名找到了该用户。(由于某种原因无法使用电子邮件)

Discourse::InvalidAccess: can_delete_user? 失败
来自 /var/www/discourse/lib/guardian/ensure_magic.rb:11:in `method_missing'

命令

UserDestroyer.new(Discourse.system_user).destroy(User.find_by(username: "someuserwhocertainlyexists"), delete_posts: true)

我也遇到了同样的错误:

UndefinedColumn: ERROR: 列 users.email 不存在
LINE 1: SELECT "users".* FROM "users" WHERE "users"."email" = 'test'...

我认为可以更新 jomaxro 的回复,加入一个可运行的示例。:slight_smile:
另外,如果要通过电子邮件地址删除用户,相应的命令是什么?

1 个赞

抱歉延迟,已修复。

3 个赞

你好,我遇到了同样的错误:

Discourse::InvalidAccess: can_delete_user? 失败
from /var/www/discourse/lib/guardian/ensure_magic.rb:11:in `method_missing'

有什么想法吗?

你好,有人有解决方案吗?似乎只有在尝试删除某些账户时才会发生,而其他账户则不会,但我无法找出原因。

我的循环运行示例:

2821 : Gurpreet
2969 : GUY26
3012 : dboy3587
3015 : devilsports
3020 : jimyyyy
3029 : vdubgrub
3071 : Frank1
3126 : volgano
3172 : dawei
3307 : almolatham
3320 : embsoft
3352 : auto
3379 : sulemaninc
3447 : Baton
3463 : galvin
3465 : autopartchina
3497 : tracker
Discourse::InvalidAccess: can_delete_user? failed
from /var/www/discourse/lib/guardian/ensure_magic.rb:11:in `method_missing'

所有用户都已被删除,但最后一个除外。如果我跳过这个用户,它会继续删除后续用户,直到因不明原因无法删除另一个用户为止。

编辑:我不得不修改以下设置:
delete all post max
delete_user_max_post_age
:+1:t6:

4 个赞

看起来您无法使用此命令删除管理员用户?:thinking:

正确。工作人员用户无法被删除。若要删除该用户,您首先需要移除其管理员权限。

u = User.find_by_username_or_email("ex@example.com")
u.admin = false
u.moderator = false
u.save
UserDestroyer.new(Discourse.system_user).destroy(u, delete_posts: false)
3 个赞

谢谢:delete_user_max_post_age 帮助我清理我超过20年的旧数据库

2 个赞