Suppression d'utilisateurs dans la console Rails

Nous utilisons l’authentification unique (SSO) pour connecter les utilisateurs qui se sont authentifiés sur notre site principal.

L’un de nos utilisateurs a reçu un message (lors de la connexion) indiquant qu’une erreur s’était produite et qu’elle devait contacter un administrateur. Nous l’avons donc recherchée, mais n’avons pas trouvé son profil.

J’ai fait la première chose qui m’est venue à l’esprit et je l’ai « supprimée » via la ligne de commande :

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

Ce qui n’était pas une bonne idée et n’a pas vraiment fonctionné. Lorsqu’elle a tenté de se connecter, elle a rencontré la même erreur. Maintenant, son profil existe (il n’est pas trouvable via la recherche, mais accessible via l’URL), mais sans adresse e-mail, sans sel ni hachage de mot de passe.

Comment puis-je la supprimer complètement du système de manière à ce qu’elle puisse se reconnecter ?

Je suis preneur de toute suggestion.

Voici le profil tel qu’affiché lors de la recherche par 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 « J'aime »

Vous devrez utiliser UserDestroyer pour supprimer correctement un utilisateur. Voici un exemple qui devrait fonctionner :

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

Cela permettra à l’utilisateur système de supprimer l’utilisateur dont l’adresse e-mail est ex@example.com. Vous pouvez également fournir un nom d’utilisateur à la place de l’adresse e-mail.

Si vous souhaitez que les journaux indiquent qui a supprimé l’utilisateur, remplacez Discourse.system_user par User.find_by_username_or_email("admin@example.com"), où admin@example.com est l’adresse e-mail d’un administrateur du site.

2 « J'aime »

Bonjour Joshua et merci pour votre réponse rapide.

Malheureusement, cela a entraîné une erreur :

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

Remarque : j’ai utilisé le nom d’utilisateur au lieu de l’adresse e-mail pour trouver l’utilisateur, car l’e-mail avait été supprimé par ma faute.

D’accord, cela signifie que l’utilisateur que vous essayez de supprimer a des publications : PostsExistError.

La méthode de résolution suggérée ici consiste à examiner les publications de l’utilisateur et à les supprimer une par une, au cas où il y en aurait que vous souhaiteriez conserver en modifiant l’utilisateur. N’oubliez pas que la suppression de la première publication d’un sujet supprime également le sujet.

La méthode « faites-le simplement » consisterait à remplacer delete_posts: false par delete_posts: true.

1 « J'aime »

Je vois cette erreur. J’ai trouvé l’utilisateur par son nom d’utilisateur. (Impossible d’utiliser l’adresse e-mail pour une raison quelconque)

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

La commande

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

J’ai rencontré la même erreur :

UndefinedColumn: ERROR:  la colonne users.email n'existe pas
LIGNE 1: SELECT "users".* FROM "users" WHERE "users"."email" = 'test'...

Je pense que la réponse de jomaxro pourrait être mise à jour avec un exemple fonctionnel. :slight_smile:
Par ailleurs, quelle serait la commande pour supprimer un utilisateur en utilisant son adresse e-mail ?

1 « J'aime »

Désolé pour le retard, c’est corrigé.

3 « J'aime »

Bonjour, je rencontre la même erreur :

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

Une idée ?

Salut, personne n’a de solution ? Cela semble se produire uniquement lors de la tentative de suppression de certains comptes mais pas d’autres, et je ne parviens pas à comprendre pourquoi.

Exemple de ma boucle en cours d’exécution :

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'

Tous les utilisateurs ont été supprimés, sauf le dernier. Si je saute celui-ci, il supprimera les utilisateurs suivants jusqu’à ce qu’il ne puisse plus en supprimer un autre pour une raison indéterminée.

edit : J’ai dû modifier ces paramètres :
delete all post max
delete_user_max_post_age
:+1:t6:

4 « J'aime »

Il semble que vous ne puissiez pas supprimer les utilisateurs administrateurs avec cette commande ? :thinking:

Correct. Les utilisateurs du personnel ne peuvent pas être supprimés. Pour supprimer l’utilisateur, vous devez d’abord retirer ses droits d’administrateur.

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 « J'aime »

Merci : delete_user_max_post_age m’aide à nettoyer ma vieille base de données (plus de 20 ans)

2 « J'aime »