rails 콘솔에서 사용자 삭제

우리는 SSO를 사용하여 메인 웹사이트에서 인증된 사용자를 로그인시킵니다.

우리 사용자 중 한 명이 로그인 시 오류가 발생했으며 관리자에게 문의해야 한다는 메시지를 받았습니다. 그래서 해당 사용자를 검색해 보았지만 프로필을 찾을 수 없었습니다.

제가 할 수 있는 최선의 방법이라고 생각한 것, 즉 명령줄을 통해 그녀를 "삭제"했습니다.

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

이것은 현명한 조치가 아니었고 실제로 작동하지도 않았습니다. 그녀가 다시 로그인하려고 했을 때 동일한 오류가 발생했습니다. 이제 그녀의 프로필은 존재합니다(검색으로는 찾을 수 없지만 URL로는 접근 가능) 하지만 이메일, 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)

이렇게 하면 시스템 사용자가 이메일이 ex@example.com인 사용자를 삭제합니다. 이메일 대신 사용자 이름을 지정할 수도 있습니다.

로그에 사용자가 누구에 의해 삭제되었는지 표시되기를 원한다면, Discourse.system_user를 User.find_by_username_or_email("admin@example.com")으로 교체하세요. 여기서 admin@example.com은 사이트 관리자의 이메일입니다.

조슈아님, 빠른 답변 감사합니다.

불행히도 이로 인해 오류가 발생했습니다.

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

참고: 이메일이 삭제되어 있었기 때문에(제 실수입니다) 사용자를 찾기 위해 이메일 대신 사용자명을 사용했습니다.

즉, 삭제하려는 사용자에게 게시글이 있다는 뜻입니다: PostsExistError.

해결 방법으로 제안하는 것은 사용자의 게시글을 검토한 후, 사용자를 변경하여 보관할 게시글이 있는지 확인하면서 1개씩 삭제하는 것입니다. 주제 내의 첫 번째 게시글을 삭제하면 주제 자체도 함께 삭제된다는 점을 기억하세요.

“그냥 해버리기” 방식은 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년 이상)를 정리할 수 있었습니다.