Удаление пользователей в консоли Rails

Мы используем SSO для входа пользователей, прошедших аутентификацию на нашем основном сайте.

Один из наших пользователей получил сообщение (при входе) об ошибке с рекомендацией обратиться к администратору. Мы попытались найти её профиль, но не смогли.

Я сделал первое, что пришло в голову, и «удалил» её через командную строку:

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

Это было неумно и не сработало по-настоящему. При попытке войти она снова увидела ту же ошибку. Теперь её профиль существует (не находится через поиск, но доступен по URL), однако у него отсутствуют email, salt и хеш пароля.

Как можно полностью удалить её из системы так, чтобы она могла снова войти?

Буду благодарен за любые советы.

Прикрепляю данные профиля, полученные через 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>

Вам следует использовать UserDestroyer для корректного удаления пользователя. Примерно так:

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

Это заставит системного пользователя удалить пользователя с email ex@example.com. Вы также можете указать имя пользователя вместо email.

Если вы хотите, чтобы в логах было указано, кто удалил пользователя, замените Discourse.system_user на User.find_by_username_or_email("admin@example.com"), где admin@example.com — это email администратора сайта.

Привет, Джошуа, спасибо за быстрый ответ.

К сожалению, это привело к ошибке:

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

примечание: я использовал имя пользователя вместо email для поиска пользователя, так как email был удалён по моей глупости

OK, значит, пользователь, которого вы пытаетесь удалить, имеет публикации: PostsExistError.

Рекомендуемый способ решения здесь — просмотреть публикации пользователя и удалить их по одной, на случай если есть те, которые вы хотите сохранить, изменив владельца. Помните, что удаление первой публикации в теме удаляет и саму тему.

Метод «просто сделай это» — изменить delete_posts: false на delete_posts: true.

Я вижу эту ошибку. Я нашел пользователя по имени пользователя. (По какой-то причине не удалось использовать электронную почту)

Discourse::InvalidAccess: can_delete_user? failed
from /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:  column users.email does not exist
LINE 1: SELECT "users".* FROM "users" WHERE "users"."email" = 'test'...

Думаю, ответ jomaxro можно обновить рабочим примером. :slight_smile:
Также, какая команда нужна для удаления пользователя по его адресу электронной почты?

Извините за задержку, исправлено.

Привет, у меня возникает та же ошибка:

Discourse::InvalidAccess: can_delete_user? failed
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:

Похоже, что с помощью этой команды нельзя удалить пользователей-администраторов? :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)

Спасибо: delete_user_max_post_age помог мне очистить старую базу данных (более 20 лет).