Discourse JS User Object を使用して、現在のユーザーが「所属している」グループを確認しています。
一部のユーザーでは、User の JS Object 内の groups 配列が、ユーザーが所属するグループをそれぞれ説明するオブジェクトの適切な配列として返されます。例:
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
}
しかし、ほとんどのユーザーでは、groups 配列は単に空 (0) になります。
これらのユーザーはグループに正しく所属しているにもかかわらず、これが原因で何が起こるのか理解できません。
「プライマリグループ」に関連しているかどうかを確認しましたが、groups 配列を持つユーザーもプライマリグループに所属していないため、これは問題ではありません。
ユーザーログインを処理するために WP SSO Connection を使用しています。ユーザーは WP インスタンスにログインし、Discourse インスタンスは基本的に WP の「スレーブ」であり、Discourse は WP からすべてのユーザーデータをプルし、ログインは WP で処理されます。
「誤った」ユーザーが WP で少なくとも一度は正常にログインし、Discourse に少なくとも一度アクセスしてログインしたことを確認しました。ユーザーが正しいグループに追加されることは確認できます。ただし、User JS Object の groups 配列には表示されません。
これがなぜ起こるのか、そしてこれをどのように修正できるのか、誰か教えていただけますか?
その配列でユーザーが所属するグループを「必死に」必要としています 
ちなみに、もし重要であれば、現在のユーザー JS Object を取得する方法は次のとおりです。グループの問題が一部のユーザー(実際にはほとんど)に影響を与える場合を除き、これまでのところうまく機能しています。
$(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);//多くのユーザーで空になります。
console.log(result.current_user);//ここにあるすべてのデータは、GROUPS配列を除き、すべてのユーザーに対して正しく入力されています。
},
error: function(result){
console.log('Error: '+result);
}
});
});
angus
(Angus McLeod)
2
現在ログインしているユーザーのセッションエンドポイント(つまり session/current)を使用しています。このエンドポイントから「自動」グループ(例:信頼レベルグループ)を取得できるのはスタッフメンバーのみです。
その例については、https://meta.discourse.org/g を参照してください。エンドポイントは同じではありませんが、原則は同じです。このフォーラムではスタッフメンバーではないため、メタで全ての信頼レベルグループが表示されないことがわかります。
APIキーを使用した認証済みリクエストを使用しないと、自動グループを含むユーザーの全てのグループを取得できません。このJavaScriptがWordPressで実行されている場合は、WP Discourseユーティリティ関数を使用してこれを行うことができます。管理インターフェースで指定したAPIキーを使用してリクエストを行います。
「いいね!」 2
Lhc_fl
(Linca)
3
本当ですか?そんなに複雑だとは思えませんが?
これは
await $.ajax(\"/u/Lhc_fl.json\") からのものです。
明らかに私はMetaのスタッフではありませんが、私の「自動」グループを見ることができます。
「いいね!」 2
@Lhc_fl、現在のユーザーのユーザー名を取得し(おそらく私と同じAJAXを使用していますか?)、次にそのユーザーJSONに別のAJAXを送信し、そこからグループを取得したということでしょうか?
@angusのアプローチも気に入っています。私のコードはDiscourse側にありますが、同じAPIキーを使用して認証することはできますか?
withCredentialsを使用しているため、コードはユーザーが認証されている場合にのみ実行され、データは常に同じになると想定していました。
データが同じでない理由がわかりません。ユーザーがどのグループに属しているかを伝えることはセキュリティ上の懸念事項ですか?実際のグループデータや、そのグループの他のユーザーを伝えているわけではないように見えます。
いずれにしても、提案されたアプローチを試しています…
ありがとうございます!
Lhc_fl
(Linca)
5
もしあなたがディスコースのコンポーネントを開発しているなら…ディスコースのAPIを使うのが一番簡単な方法だと思います。クライアントを開発しているなら、ユーザー名はとっくに知られているべきだと思いますか?
前者の例はこちらです。
require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api)=>{console.log(api.currentUser())});
「いいね!」 2
pfaffman
(Jay Pfaffman)
6
現在のユーザーオブジェクトにアクセスでき、ユーザーがメンバーであることを認識しているグループが表示されます。これはすべてのユーザーに対して既にロードされているため、現在のユーザーを確認する他のテーマと同様にプラグインAPIにアクセスできます。Theme Developer Quick Reference Guide を参照して、例を確認してください。
このトピックに関連して推奨されているトピックには、例があります: currentUser.groups doesn't match group_users table
「いいね!」 1
皆さん、ありがとうございました。
この特定のインスタンスでは、groups は(現在のセッションではなくユーザーのAPIを使用しても)空のままでしたが、グループの ID を group_users でチェックすることでこれを達成できました。group_users にも同じデータが格納されていますが、名前は含まれていません。
これはDiscourseのheadスクリプトとして追加された「単なる」スニペットであり、テーマやプラグインではないため、元の方法でデータを取得しました。
実際の api を機能させることができませんでしたが、AJAXアプローチは私が必要としていたものには問題なく機能しました。
入力してくださった皆さん、特に私のケースで正しい解決策につながるアプローチを教えてくださった @Lhc_fl さん、本当にありがとうございました。
「いいね!」 2
pfaffman
(Jay Pfaffman)
クローズされました:
10
このトピックは11日後に自動的に閉じられました。返信はもうできません。