Eliminando usuarios en la consola de rails

Estamos utilizando SSO para iniciar sesión en usuarios que se autenticaron en nuestro sitio web principal.

Uno de nuestros usuarios recibió un mensaje (al iniciar sesión) indicando que hubo un error y que debía contactar a un administrador. Así que la buscamos, pero no pudimos encontrar su perfil.

Hice lo primero que se me ocurrió y la “eliminé” mediante la línea de comandos:

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

lo cual no fue inteligente y realmente no funcionó. Cuando intentó iniciar sesión, se encontró con el mismo error. Ahora su perfil existe (no es buscable mediante búsqueda, pero sí mediante URL), pero sin correo electrónico, salt ni hash de contraseña.

¿Cómo puedo eliminarla del sistema de manera que pueda iniciar sesión nuevamente?

Agradezco cualquier aporte.

Adjunto el perfil obtenido al buscar mediante 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 me gusta

Deberás utilizar UserDestroyer para eliminar un usuario correctamente. Algo como esto debería funcionar:

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

Esto hará que el usuario del sistema elimine al usuario con el correo electrónico ex@example.com. También puedes proporcionar un nombre de usuario en lugar del correo electrónico.

Si deseas que los registros muestren quién eliminó al usuario, reemplaza Discourse.system_user con User.find_by_username_or_email("admin@example.com"), donde admin@example.com es el correo electrónico de un administrador del sitio.

2 Me gusta

Hola Joshua y gracias por tu rápida respuesta.

Desafortunadamente, esto resultó en un error:

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

Nota: usé el nombre de usuario en lugar del correo electrónico para encontrar al usuario, ya que el correo electrónico fue eliminado por mi propia torpeza.

OK, eso significa que el usuario que intentas eliminar tiene publicaciones: PostsExistError.

El método recomendado para resolver esto sería revisar las publicaciones del usuario y eliminarlas una por una, por si hay alguna que desees conservar cambiando el usuario. Recuerda que eliminar la primera publicación de un tema también elimina el tema.

El método de “simplemente hazlo” sería cambiar delete_posts: false a delete_posts: true.

1 me gusta

Veo este error. Encontré al usuario por nombre de usuario. (Por alguna razón no pude usar el correo electrónico)

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

El comando

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

Yo encontré el mismo error:

UndefinedColumn: ERROR:  la columna users.email no existe
LINE 1: SELECT "users".* FROM "users" WHERE "users"."email" = 'test'...

Creo que la respuesta de jomaxro podría actualizarse con un ejemplo funcional. :slight_smile:
Además, ¿cuál sería el comando para eliminar un usuario usando su dirección de correo electrónico?

1 me gusta

Perdón por la demora, ya está solucionado.

3 Me gusta

Hola, estoy encontrando el mismo error:

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

¿Alguna idea?

Hola, ¿nadie tiene una solución? Parece que solo ocurre al intentar eliminar algunas cuentas y no otras, y no logro entender por qué.

Ejemplo de mi bucle en ejecución:

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'

Todos los usuarios han sido eliminados, excepto el último. Si salto este, se eliminarán los siguientes hasta que no pueda eliminar otro usuario por una razón no identificada.

edit: Tuve que editar estas configuraciones:
delete all post max
delete_user_max_post_age
:+1:t6:

4 Me gusta

Parece que no puedes eliminar usuarios administradores con este comando. :thinking:

Correcto. Los usuarios de personal no se pueden eliminar. Para eliminar al usuario, primero debes quitarle el acceso de administrador.

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 Me gusta

Gracias: delete_user_max_post_age me ayuda a limpiar mi antigua base de datos (más de 20 años)

2 Me gusta