Benutzer JS-Objekt `groups`-Array für mehrere Benutzer nicht gefüllt

Ich verwende das Discourse JS User Object, um die Gruppen des aktuellen Benutzers zu überprüfen, denen er “angehört”.

Bei einigen Benutzern gibt das groups-Array im User JS Object ein korrektes Array von Objekten zurück, die jeweils eine Gruppe beschreiben, der dieser Benutzer angehört. Beispiel:

groups: Array (5)
0 {
  id: 1,
  name: "admins",
  has_messages: false
}
1 {
  id: 46,
  name: "custom-group",
  has_messages: false
}
2 {
  id: 3,
  name: "staff",
  has_messages: false
}
3 {
  id: 10,
  name: "trust_level_0",
  has_messages: false
}
4 {
  id: 11,
  name: "trust_level_1",
  has_messages: false
}

Bei den meisten Benutzern ist das groups-Array jedoch einfach leer (0).
Ich kann nicht herausfinden, warum das so ist, da diese Benutzer korrekt Mitglied von Gruppen sind.
Ich habe auch geprüft, ob es mit der “primären Gruppe” zusammenhängt. Die Benutzer, die ein groups-Array haben, sind jedoch auch nicht in einer primären Gruppe, also ist das nicht das Problem.

Ich verwende eine WP SSO Connection, um die Benutzeranmeldungen zu verwalten. Sie melden sich also auf einer WP-Instanz an, und die Discourse-Instanz ist im Grunde eine “Slave”-Instanz von WP, d.h. Discourse zieht alle Benutzerdaten aus WP und die Anmeldung wird in WP gehandhabt.
Ich habe sichergestellt, dass sich der “fehlerhafte” Benutzer mindestens einmal korrekt in WP angemeldet hat und mindestens einmal zu Discourse gegangen ist, damit er angemeldet ist, und ich kann bestätigen, dass der Benutzer den richtigen Gruppen hinzugefügt wird - es ist nur nicht im groups-Array im User JS Object sichtbar.

Kann mir jemand helfen, warum das passiert und wie ich es beheben kann?
Ich brauche die Gruppe, der der Benutzer angehört, dringend in diesem Array :slight_smile:

Übrigens, falls es wichtig ist, hier ist, wie ich das aktuelle User JS Object abrufe - funktioniert bisher gut, es sei denn, das Gruppenproblem betrifft einige Benutzer (die meisten, tatsächlich).

$(document).ready(function() {
    $.ajax({
        type: 'GET',
        cache: false,
        url: 'https://discourse.domain.tld/session/current.json',
        dataType: 'json',
        xhrFields: {
            'withCredentials': true
        },
        success: function(result){
            var current_user_groups = result.current_user.groups;
            console.log(current_user_groups);// Dies gibt für viele Benutzer leer zurück.
            console.log(result.current_user);// Alle Daten hier sind für ALLE Benutzer korrekt ausgefüllt, außer dem GROUPS-Array.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

Sie verwenden den Session-Endpunkt für den aktuell angemeldeten Benutzer (d. h. session/current). Nur Mitarbeiter erhalten von diesem Endpunkt die „automatischen“ Gruppen (z. B. Vertrauensstufengruppen).

Als Beispiel sehen Sie sich https://meta.discourse.org/g an. Es ist nicht derselbe Endpunkt, aber das gleiche Prinzip gilt. Sie werden sehen, dass Sie nicht alle Vertrauensstufengruppen auf Meta sehen können, da Sie in diesem Forum kein Mitarbeiter sind.

Sie müssen eine authentifizierte Anfrage, d. h. mit einem API-Schlüssel, verwenden, um alle Gruppen eines Benutzers, einschließlich automatischer Gruppen, abzurufen. Wenn dieser JavaScript-Code auf WordPress läuft, können Sie die WP Discourse-Hilfsfunktionen verwenden, um dies zu tun. Er wird eine Anfrage mit dem API-Schlüssel stellen, den Sie in der Admin-Oberfläche angegeben haben.

2 „Gefällt mir“

Wirklich? Ich glaube nicht, dass es so kompliziert sein sollte?


Das kommt von await $.ajax("/u/Lhc_fl.json")
Offensichtlich bin ich kein Mitarbeiter von Meta, aber ich kann meine „automatischen“ Gruppen sehen.

2 „Gefällt mir“

@Lhc_fl, Sie haben also den Benutzernamen des aktuellen Benutzers abgerufen (ich nehme an, mit demselben AJAX wie ich?), dann ein weiteres AJAX zu diesem Benutzer-JSON und von dort die Gruppe?

Mir gefällt auch @angus’ Ansatz – mein Code ist jedoch auf der Discourse-Seite… Ich könnte einfach denselben API-Schlüssel verwenden und mich damit authentifizieren?
Ich hatte angenommen, dass der Code, da ich withCredentials verwende, nur ausgeführt wird, wenn ein Benutzer authentifiziert ist, und dass die Daten immer dieselben wären.

Ich bin mir nicht sicher, warum die Daten nicht dieselben sind. Ist es ein Sicherheitsproblem, zu kommunizieren, in welcher Gruppe sich ein Benutzer befindet? Soweit ich sehe, kommunizieren wir nicht die tatsächlichen Gruppendaten oder andere Benutzer in dieser Gruppe.

Auf jeden Fall probiere ich jetzt die vorgeschlagenen Ansätze aus…

Danke!

Wenn Sie Komponenten für Discourse entwickeln … Ich denke, der einfachste Weg ist die Verwendung der Discourse-API. Wenn Sie einen Client entwickeln, sollte der Benutzername meiner Meinung nach schon lange bekannt sein?

Für ersteres hier ein Beispiel;

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api) => {console.log(api.currentUser())});
2 „Gefällt mir“

Sie sollten in der Lage sein, auf das aktuelle Benutzerobjekt zuzugreifen, und das zeigt Ihnen, welchen Gruppen der Benutzer angehört. Es ist bereits für jeden Benutzer geladen, sodass Sie auf die Plugin-API zugreifen können, wie bei jedem anderen Theme, das den aktuellen Benutzer betrachtet. Es gibt Beispiele, die Sie im Theme Developer Quick Reference Guide durchgehen können.

Dieses Thema, das für dieses Thema empfohlen wird, enthält ein Beispiel: currentUser.groups doesn't match group_users table

1 „Gefällt mir“

Danke an alle

Während bei dieser speziellen Instanz die groups immer noch leer bleibt (auch mit der API des Benutzers anstelle der aktuellen Sitzung), konnte ich dies erreichen, indem ich die Gruppen-ID in group_users überprüfte, die ebenfalls dieselben Daten speichert, nur eben nicht mit dem Namen.

Ich habe meinen ursprünglichen Ansatz verwendet, um die Daten zu erhalten, da dies “nur” ein Snippet ist, das in Discourse als head-Skript hinzugefügt wurde, kein Theme oder Plugin.
Ich konnte die eigentliche api nicht zum Laufen bringen, aber der AJAX-Ansatz funktioniert für das, was ich brauchte, genauso gut.

Nochmals vielen Dank an alle für die Beiträge, insbesondere an @Lhc_fl, dessen Ansatz mich zur richtigen Lösung für meinen Fall geführt hat.

2 „Gefällt mir“

Dieses Thema wurde nach 11 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.