martin
(Martin Brennan)
23
没问题!很高兴 disallowed_groups 能帮上忙。我已经合并了那个 PR。
既然我们现在有了 disallowed_groups 和 resolve_group_memberships,我需要全面检查一遍所有的官方主题和组件。建议你和 @moin 在方便的时候也对你们自己的主题和组件进行同样的检查,因为在我对官方仓库进行修改之后,我非常希望能推进将原帖中提到的变更设为“稳定版”(stable)。
目前有许多其他核心工作都依赖或使用了 anonymous_users 和 logged_in_users,我非常希望能删除 everyone 这个组。
3 个赞
Lilly
(Lillian )
24
嘿 Martin - 有个问题:
我刚刚对实例进行了完整更新,现在正在根据这里的自动组 ID,将 disallowed_groups 对象设置添加到我的组件中,针对 everyone(所有人)和 anonymous_users(匿名用户):
像这样:
groups:
type: groups
disallowed_groups: "0|4"
required: true
resolve_group_membership: true
validations:
max: 20
但在组件组下拉设置中仍然显示 everyone(所有人):
我在对象设置中哪里做错了?我注意到即使对象中没有 disallowed_groups,它也不会显示 anonymous_users(匿名用户)组(所以目前,无论我是否设置 disallowed_groups,我组件中的列表都没有区别)。我用其他组 ID 进行了测试,我在使用 disallowed_groups(或语法)时一定做错了什么,因为无论使用哪些 ID,它似乎都没有任何效果。
4 个赞
martin
(Martin Brennan)
25
哦,今天早些时候 GitHub 上出现了一些问题,所以 disallowed_groups 的更改才刚刚合并到最新的 Commits · discourse/discourse · GitHub 中。
我不完全确定这就是问题所在,但你能再试一次更新,看看问题是否仍然存在吗?如果没有,请告诉我,并指向你的主题组件(或者只是你的群组侧边栏组件?),以便我进行调试 
1 个赞
Moin
26
我想这是因为你用于测试的那个论坛禁用了即将生效的更改。我已经启用了它,现在该组可见了。
我还更新了论坛,
everyone 和
anonymous_users 组按预期被隐藏了。
澄清一下:两周前是我禁用了这项更改 
3 个赞
Lilly
(Lillian )
27
哈哈
谢谢 Moin! 我其实忘了新的细粒度群组设置本来就在即将推出的更新里。
Martin,disallowed_groups 对象设置运行得完美无缺。 我非常喜欢这个改动。再次感谢团队——真是个大改进。

6 个赞
请问匿名用户和已注册用户的 CSS 类名是什么?我没有使用它们的内部 ID,因为我使用的是纯 CSS。
martin
(Martin Brennan)
29
我们默认不会将这些 CSS 类添加到 body 元素上,您是指 CSS Classes for Current User's Groups 吗?
该组件需要更新,以便根据是否存在当前用户,添加 group-anonymous 或 group-logged-in-users 类。
2 个赞
Lilly
(Lillian )
30
嘿,马丁 
我开了一个快速的 PR 来添加这两个类(anonymous_users 和 logged_in_users)。
我还没怎么测试过(哈哈),但我觉得这挺直观的。代码只是检查当前用户是否存在,如果存在,则属于 logged_in_users,否则就是 anonymous_users。
注意: 我几乎可以肯定 Discourse 会自动添加 .anon,所以无需该组件也能实现匿名与已登录用户的 CSS 区分,但这只是简单地使用了新的群组约定。
2 个赞
martin
(Martin Brennan)
31
哦,对,你说得对,我之前没注意到,我只看了 <body> 标签:
不过我还是批准了你的组件 PR,我觉得这样没问题 
2 个赞
martin
(Martin Brennan)
33
另外,顺便告知大家,我之前还没有在这里发帖,但我已经合并了这些 PR,以便官方组件使用 resolve_group_membership 和 disallowed_groups:
我现在正在制定此次即将进行的变更的后续步骤计划。我认为在核心/插件代码库中,仍有一些地方直接查看 everyone 或者在服务器端未使用 user.in_any_groups?。
2 个赞
Moin
34
请问有什么原因导致这个还没有合并吗?
我开这个帖子的原因是,我终于更新了我的组件
[quote=“martin, post:14, topic:402273”]
我会建议你在你的主题组件中将 default_favorite_filters_groups 的默认值改为 4|5(即已登录用户和匿名用户),而不是即将弃用的 0(所有人)。
[/quote]\n我已经照做了。但我仍然觉得这似乎只对我更改设置后添加该组件的论坛有帮助。对于那些已经在使用该组件的论坛,新的默认值并没有应用(这通常是好事!)。因此,我仍然看到一个问题:对于那些已经在使用该组件的用户来说,行为发生了意想不到的变化。
另外,你知道如果管理员配置了一个设置,而我在我更新中将其添加为不允许的组,会发生什么吗?
由于我不认为这个组件在很多论坛上使用,所以我并没有太担心,还是合并了。但是,迁移和设置不允许的组可能也对其他主题开发者很重要。
martin
(Martin Brennan)
35
没有,不知怎么的,我猜我的大脑以为这不是 discourse 组织的 PR
会在 CI 检查运行后不久合并。
对于这些情况以及未来的其他情况,我认为最好的方法可能是为每个主题/组件编写迁移 Migrate Discourse theme settings
Moin
36
我在上面的帖子中问过这应该何时进行。如果不确定新组在所有论坛都能正常工作就进行迁移,也可能导致问题,而且管理员可以开启或关闭更改。因此,感觉很难在合适的时机进行迁移。
gormus
(Osman Görmüş)
37
如果之前已经提到过,而我错过了,请见谅……
我意识到,如果设置中包含了 resolve_group_membership,我就只能通过 user_in_ 前缀访问布尔值,而不再能访问设置字段的原始值。
aabbccdd_allowed_groups:
refresh: true
default: "1|2"
type: list
list_type: group
resolve_group_membership: true
console.log(settings.aabbccdd_allowed_groups); // undefined
console.log(settings.user_in_aabbccdd_allowed_groups); // true 或 false
这是有意为之的吗?
1 个赞
Moin
38
我认为是的。否则,这个bug的解决方案可能会有所不同。
这也合乎逻辑。user_in_x 还会检查前端未知的群组,因为该群组仅对管理员可见,或者其默认可见性受到限制,例如 everyone。因此,根据所使用的检查方式,你会得到不同的结果,所以将两者结合可能会产生意想不到的后果。
2 个赞
martin
(Martin Brennan)
39
谢谢 Moin,你说得完全正确。@gormus 目前实际获取组 ID 的唯一位置仍然是在主题设置的后台管理界面中。
我不确定我之前的帖子是否已经说得很清楚,但 anonymous_users(匿名用户)和 logged_in_users(已登录用户)在任何时候都可以直接使用,无需启用即将推出的这项更改,我是几个月前独立添加它们的。即将推出的更改主要做的是以下几点:
因此,无论如何,如果你在所有使用 everyone 的地方将其移除,并从现在开始仅使用 anonymous_users 和 logged_in_users,你将是安全的。
今天我计划制定出一份完成剩余工作的计划,以彻底移除站点设置中的 everyone(暂时不涉及分类设置),并将计划发布在这里,希望这有助于我们今后保持一致,并且我可以在推进过程中不断更新此计划。
3 个赞
Moin
40
但是如果禁用了该更改,这些组在界面上是不可见的。管理员无法将设置更改为这些组。因此,当我将“所有人”添加为 disallowed_group 时,他们就不再看到任何允许他们设置组件对访客可见的组。对我来说,“可用”不仅意味着能工作,还意味着可见。由于仍然可以禁用该更改,我不会说仅依赖新组是“安全”的。
1 个赞
martin
(Martin Brennan)
41
嗯,你说得对。为了让这个 disallowed_group 问题在即将推出的更改被禁用时消失,我还需要修复另外几件事:
anonymous_users 和 logged_in_users 根本没有出现在群组选择器中。我认为现在在这里允许使用它们是安全的,这样即使即将推出的更改被关闭,你也将 everyone 添加到 disallowed_groups 中也不会产生影响。
- 修复
Guardian::AnonymousUser#in_any_groups?,使其在即将推出的更改被关闭时尊重 anonymous_users。
- 为主题设置添加与站点设置相同的读取时间别名
0 (everyone) → 5 (logged_in_users)。
我认为在即将推出的更改仍然可选且被禁用的期间,我可能还会在群组选择器中将 everyone 标记为 (legacy)(旧版)。
我会优先处理这些事项,并将它们加入我正在制定的整体计划中。
martin
(Martin Brennan)
42
我在这里 @moin 创建了一个专用话题 The road to stable, then permanent, for granular_anonymous_and_logged_in_groups_permissions 。原帖内容尚不完整,我仍在本地逐一排查所有情况,并会持续更新。如果你愿意继续在此话题中发帖,我也没问题,但我更希望我们将后续讨论移至新话题,以便我能引用原帖中的部分内容或适时补充内容。
2 个赞
等等,我刚看到这个。
所以有些人对“everyone”(所有人)仅仅指代“已登录用户”感到困惑?
谁啊?!
“everyone”就是所有人,这不是很清楚吗?
“everyone”应该是所有访问网站的人,无论是否登录,这不是很简单吗?
那么现在,一个完全公开的类别现在必须至少包含两个组,而不是一个——“已登录用户”和“匿名用户”?这太荒唐了,这根本不是升级吧?
而且,如果并非如此,如果你只需要添加“anon”(匿名),因为它是“everyone”的同义词——那这也是不正确的,因为已登录用户并不是匿名的。
之前关于 Discourse 的一些“学习”在于,在某些情况下,TL0 意味着“所有拥有账户并已登录的人”,但也可能意味着“那些尚未达到 TL1 但拥有账户并已登录的人”。
关键在于,它并不代表单一的人群,它代表的是一个阈值,这才是关键。
仅仅将 TL0 改为“已登录用户”,就破坏了每个安全级别作为阈值的连贯性。TL1 同样也是一个阈值,而不仅仅是一个“单一群体”。那么,这是否意味着我们需要一个名为“至少信任级别为 1 的已登录用户”的组?!
我完全不相信这些需要更改——为了改变而改变吗?
3 个赞