Passwort zurücksetzen mit benutzerdefinierter Ruby-Datei

Benutzerdefinierte Funktion zum Aktualisieren von Passwörtern in Discourse

Können wir diesen Code verwenden, um das Passwort zu aktualisieren?

z.B.:-
User.find_by(username: ‘gollum’).update!(password: ‘shiiiire!-BAGGINS!’)

Oder

Können wir ein benutzerdefiniertes Plugin erstellen und einen benutzerdefinierten Endpunkt wie eine API verwenden
und ein Token mit Benutzeranmeldeinformationen erstellen, dann das Passwort mit der API zurücksetzen.

Bitte teilen Sie uns den besten Weg mit, diese Aufgabe zu erledigen.

Hallo Hitesh,

Was wäre Ihr Anwendungsfall? Warum nicht die integrierte Funktion verwenden?

1 „Gefällt mir“

Danke für die Antwort.

Ich verwende ein benutzerdefiniertes Skript, um Drupal-Benutzer nach Discourse zu migrieren, aber das Passwort wird als Hash-String gespeichert und der Benutzer kann sich nicht mit einem zuverlässigen Passwort wie (admin@123) anmelden.

Aber es funktioniert die Anmeldung mit ihrem Passwort-Hash wie
z.B.:- 3sdfd32423@#423fdsfr

Können Sie bitte etwas über die integrierte Funktion erklären?

Haben Sie sich das angesehen? Es könnte helfen:

Es unterstützt Drupal 7-Passwörter:

1 „Gefällt mir“

Hallo @Canapin

Außerdem habe ich dieses Plugin verwendet, aber es funktioniert nicht

Nein – es funktioniert.

Dies ist eines der ältesten Plugins von Drittanbietern (jetzt über 9 Jahre alt!) und es wurde die ganze Zeit gepflegt und hat funktioniert. Es funktioniert vielleicht nicht für Sie, aber der Weg, das zu lösen, ist herauszufinden, warum es für Sie nicht funktioniert, anstatt einen alternativen Weg zu versuchen.

Können Sie das bitte umformulieren? Ich verstehe nicht, was Sie sagen.

Speichert meine Drupal-Website Benutzerpasswörter in einem verschlüsselten Code und behält sie in einer Datenbank? Ich habe alle Benutzer auf eine Plattform namens Discourse über eine Discourse-API verschoben. Ich habe eine Nutzlast mit ihren Benutzerdetails und Passwortcodes aus der Drupal-Datenbank erstellt und sie in Discourse eingefügt.

Ich dachte, die Benutzer könnten ihre gleichen Anmeldedaten auf Drupal verwenden, aber es funktioniert nicht. Discourse akzeptiert nicht das tatsächliche Passwort des Benutzers, wie z.B. „admin@123“. Stattdessen verwendet es einen Passwort-Hash-Code des Benutzers wie „3sdfd32423@#423fdsfr“.

Discourse nimmt die Passwortcodes von Drupal und fügt sie in seinen eigenen verschlüsselten Algorithmus in seiner eigenen Datenbank ein.

Können Sie uns zeigen, wie Sie das gemacht haben?
Wenn Sie die API verwendet haben, sollten Sie den Drupal-Hash nicht als Passwort festlegen. Sie sollten den Hash als benutzerdefiniertes Benutzerfeld namens import_pass festlegen. Ich bin mir nicht sicher, ob das mit der API überhaupt möglich ist.

1 „Gefällt mir“

Ich habe Ihre Schritte bei der Installation des Discourse Migrate-Plugins befolgt

-> Zuerst habe ich das Plugin in meine Discourse-Installation eingefügt, aber nicht aktiviert, dann ein benutzerdefiniertes Feld in Discourse mit dem Namen import_pass erstellt

-> Fügen Sie im Payload den in diesem benutzerdefinierten Feld gespeicherten Passwort-Hash hinzu

-> Nachdem der Benutzer sich in Discourse hochgeladen hat, aktivieren Sie das Plugin und melden Sie sich in einem neuen Fenster mit den Benutzeranmeldeinformationen an, aber sie haben es nicht getan

Dies ist ausdrücklich nicht Teil der Schritte.

Es gibt einen Unterschied zwischen dem Erstellen eines Benutzerfelds mit diesem Namen und dem Vorhandensein eines benutzerdefinierten Felds mit diesem Namen. Der Hash wird also an der falschen Stelle gespeichert.
Das Problem ist, dass ich glaube, dass letzteres (ein benutzerdefiniertes Feld) über die API nicht zugänglich ist.
Ich denke, der beste Weg ist, benutzerdefinierten Einmalcode zu haben, der den Inhalt des Benutzerfelds in das eigentliche benutzerdefinierte Feld verschiebt.

(Ich habe erwogen, das Plugin so zu ändern, dass es auch das Benutzerfeld berücksichtigt, aber ich denke, dass die Anzeige dieser Hashes in der Benutzeroberfläche ein Sicherheitsrisiko darstellt, daher werde ich das nicht tun).

Dies wird funktionieren, führen Sie es von einer Rails-Konsole aus (markiere dich, damit du die Bearbeitung siehst @Hitesh_Sharma)

ufkey = "user_field_#{UserField.find_by(name: 'import_pass').id}"
User.all.each do |u|
  if u.custom_fields.key?(ufkey)
    u.custom_fields[:import_pass] = u.custom_fields[ufkey]
    u.custom_fields.delete(ufkey)
    u.save_custom_fields
  end
end
2 „Gefällt mir“