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_userUser.find_by_username_or_email("admin@example.com") に置き換えてください。ここで admin@example.com はサイトの管理者のメールアドレスです。

「いいね!」 2

ジョシュアさん、迅速なご返信をありがとうございます。

残念ながら、エラーが発生しました。

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

補足:メールアドレスを削除してしまったため、ユーザー検索にメールアドレスの代わりにユーザー名を使用しました。

OK、つまり削除しようとしているユーザーに投稿が存在するということです:PostsExistError

ここで推奨される解決方法は、ユーザーの投稿を確認し、必要に応じてユーザーを変更して残したい投稿がある場合に、1 つずつ削除することです。トピックの最初の投稿を削除すると、トピック自体も削除されることを忘れないでください。

「とにかく実行する」方法としては、delete_posts: falsedelete_posts: true に変更することです。

「いいね!」 1

このエラーが表示されます。ユーザー名でユーザーを検索しました。(何らかの理由でメールが使えません)

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:
また、ユーザーのメールアドレスを使ってユーザーを削除するコマンドは何になりますか?

「いいね!」 1

遅くなり申し訳ありません。修正しました。

「いいね!」 3

こんにちは、同じエラーが発生しています:

Discourse::InvalidAccess: can_delete_user? が失敗しました
/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'

すべてのユーザーが削除されましたが、最後の1人は削除されませんでした。このユーザーをスキップすると、次のユーザーが削除されますが、別のユーザーが削除できなくなる理由が不明です。

編集: これらの設定を編集する必要がありました:
すべての投稿を削除する最大数
ユーザーを削除する最大投稿年齢
:+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