User JS Object `groups` 数组未为多个用户填充

我正在使用 Discourse JS 用户对象来检查当前用户“属于”哪些组。

对于某些用户,“User’s 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 连接来处理用户登录,因此他们会在 WP 实例上登录,而 Discourse 实例基本上是 WP 的“从属”,这意味着 Discourse 从 WP 拉取所有用户数据,并且登录在 WP 中处理。
我确保了“有问题的”用户至少在 WP 中正确登录过一次,并且至少访问过一次 Discourse 以便登录,并且我可以确认用户 被添加到了正确的组中 ——只是在 User JS Object 的 groups 数组中不可见。

有人能帮我找出 为什么会发生这种情况,以及 如何修复它 吗?
我“迫切”需要在该数组中获取用户所属的组 :slight_smile:

顺便说一句,如果这很重要,这就是我获取当前用户 JS 对象的方式——到目前为止效果很好,除非组问题影响 某些 用户(实际上是大多数用户)。

$(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);
        }
    });
});

你正在使用当前登录用户的会话端点(即 session/current)。只有工作人员才能从该端点获得“自动”组(例如,信任级别组)。

可以参考 https://meta.discourse.org/g 来了解相关示例。虽然不是同一个端点,但原理是相同的。你会发现你无法在 meta 上看到所有的信任级别组,因为你不是该论坛的工作人员。

你需要使用经过身份验证的请求,即带有 API 密钥的请求,才能获取用户的所有组,包括自动组。如果这段 JavaScript 在 WordPress 上运行,你可以使用 WP Discourse 工具函数来完成。它会使用你在管理员界面中提供的 API 密钥发出请求。

2 个赞

真的吗?我不认为它应该这么复杂?


这是来自 await $.ajax("/u/Lhc_fl.json")
显然我不是 Meta 的员工,但我可以看到我的“自动”群组。

2 个赞

@Lhc_fl,所以你的做法是获取当前用户的用户名(我猜是用和你一样的 AJAX?),然后通过另一个 AJAX 请求该用户的 JSON,再从中获取群组?

我也喜欢 @angus 的方法——不过我的代码是在 discourse 端……我可以直接使用相同的 API 密钥并进行身份验证吗?
我曾以为,既然我使用了 withCredentials……代码只会在用户通过身份验证时运行,_并且_数据将始终相同。

我不确定为什么数据不相同,传递用户所在的_群组_信息是否存在安全隐患?据我所见,我们并没有传递实际的群组数据或其他群组中的用户。

无论如何,我现在将尝试建议的方法……

谢谢!

如果您正在为 discourse 开发组件……我认为最简单的方法是使用 discourse 的 api。如果您正在开发客户端,我认为用户名应该早就知道了?

对于前者,这里有一个例子;

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api)=>{console.log(api.currentUser())});
2 个赞

您应该能够访问当前用户对象,它将显示用户知道他们所属的组。它已经为每个用户加载,因此您将像其他查看当前用户的插件一样访问插件 API。您可以参考 Theme Developer Quick Reference Guide 中的示例进行查找。

这个推荐给此主题的主题中有一个示例:currentUser.groups doesn't match group_users table

1 个赞

谢谢大家

虽然在此特定实例中 groups 仍然为空(即使使用用户的 api 而不是当前会话),但我通过检查 group_users 中的组 ID 实现了这一点,它也存储相同的数据,只是没有名称

我使用了原始方法来获取数据,因为这只是 Discourse 中添加的“一个”代码片段,而不是主题或插件。
我无法让实际的 api 工作,但 AJAX 方法对我需要的东西来说效果一样好。

再次感谢大家的输入,特别是 @Lhc_fl,他的方法为我提供了适合我的解决方案。

2 个赞

此主题已在 11 天后自动关闭。不再允许回复。