Eliminare utenti dalla console di rails

Stiamo utilizzando l’SSO per accedere agli utenti autenticati sul nostro sito web principale.

Uno dei nostri utenti ha ricevuto un messaggio (durante l’accesso) che indicava un errore e le suggeriva di contattare un amministratore. Abbiamo quindi cercato il suo profilo, ma non siamo riusciti a trovarlo.

Ho fatto la prima cosa migliore che mi è venuta in mente e l’ho “eliminata” tramite riga di comando:

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

Il che non è stato intelligente e non ha funzionato davvero. Quando ha provato ad accedere, si è trovata di fronte allo stesso errore. Ora il suo profilo esiste (non rintracciabile tramite ricerca, ma tramite URL), ma senza email, salt o hash della password.

Come posso rimuoverla completamente dal sistema in modo che possa accedere nuovamente?

Sono grato per qualsiasi suggerimento.

Allego il profilo ottenuto tramite 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>

Dovrai utilizzare UserDestroyer per eliminare correttamente un utente. Qualcosa del genere dovrebbe funzionare:

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

Ciò farà sì che l’utente di sistema elimini l’utente con l’email ex@example.com. Puoi anche fornire un nome utente invece dell’email.

Se vuoi che i log mostrino chi ha eliminato l’utente, sostituisci Discourse.system_user con User.find_by_username_or_email("admin@example.com"), dove admin@example.com è l’email di un amministratore del sito.

Ciao Joshua e grazie per la tua rapida risposta.

Purtroppo questo ha generato un errore:

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

nota: ho usato il nome utente invece dell’email per trovare l’utente, dato che l’email è stata cancellata da me, in modo stupido.

OK, quindi significa che l’utente che stai cercando di eliminare ha dei post: PostsExistError.

Il metodo di risoluzione consigliato qui sarebbe quello di esaminare i post dell’utente ed eliminarli uno per uno, nel caso in cui ci siano alcuni che desideri conservare modificando l’utente. Ricorda che eliminare il primo post di un argomento elimina anche l’argomento stesso.

Il metodo “fallo e basta” consisterebbe nel cambiare delete_posts: false in delete_posts: true.

Vedo questo errore. Ho trovato l’utente tramite nome utente (per qualche motivo non riesco a usare l’email).

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

Il comando

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

Ho riscontrato lo stesso errore:

UndefinedColumn: ERROR:  la colonna users.email non esiste
LINE 1: SELECT "users".* FROM "users" WHERE "users"."email" = 'test'...

Credo che la risposta di jomaxro potrebbe essere aggiornata con un esempio funzionante. :slight_smile:
Inoltre, qual sarebbe il comando per eliminare un utente utilizzando il suo indirizzo email?

Scusa il ritardo, è stato risolto.

Ciao, sto riscontrando lo stesso errore:

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

Hai qualche idea?

Ciao, nessuno ha una soluzione? Sembra che accada solo quando si tenta di eliminare alcuni account ma non altri, e non riesco a capire il motivo.

Esempio del mio ciclo in esecuzione:

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'

Tutti gli utenti sono stati eliminati, tranne l’ultimo. Se salto questo, eliminerà i prossimi utenti fino a quando non potrà eliminarne un altro per un motivo non identificato.

Modifica: ho dovuto modificare queste impostazioni:
delete all post max
delete_user_max_post_age
:+1:t6:

Sembra che non si possano eliminare gli utenti admin con questo comando? :thinking:

Corretto. Gli utenti staff non possono essere eliminati. Per eliminare l’utente, devi prima rimuovere i suoi privilegi di amministratore.

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)

Grazie: delete_user_max_post_age mi aiuta a ripulire il mio vecchio database (più di 20 anni)