为匿名和登录用户设置基于组的细粒度权限

在我们的代码库中,一直存在一个历史上令人困惑的伪组 @everyone,它可用于:

  • 类型为 group_list 的站点设置
  • 分类权限
  • 标签组

在某些情况下,人们将 @everyone 理解为“所有匿名用户和所有登录用户”,而另一些人则将其理解为“仅所有登录用户”。实际上,对于大多数站点设置而言,它仅表示“所有登录用户”。

此外,@everyone 组还可用于某些站点设置,而这些设置显然不应允许“所有匿名用户和登录用户”访问相关功能,例如 pm_tags_allowed_for_groups,这进一步加剧了混乱。

从功能标记和开发者体验的角度来看,这也存在混淆,因为对于某些即将推出的变更或其他设置,我们可能确实希望为“所有匿名用户和登录用户”启用它们。

解决方案

我们将引入两个独立的自动伪组:

  • anonymous_users (ID 4) - 代表没有账户、访问您站点的匿名用户
  • logged_in_users (ID 5) - 代表所有已登录您站点的用户,其效果类似于 trust_level_0 自动组,但更加具体

这些组已经引入,但仅在您的站点启用了即将推出的变更 granular_anonymous_and_logged_in_groups_permissions 后才会生效。

当启用该即将推出的变更时,任何将 everyone 选为组的设置都会自动转换为 logged_in_users ID,因此在切换该变更时,站点设置表中的数据不会发生变化。当该变更成为永久性变更后,我们将对所有组设置进行数据迁移以完成此更改。

此外,对于某些站点设置(例如 personal_message_enabled_groups),我们已经将 anonymous_users 标记为 disallowed_group,因为这些设置显然不适用于匿名用户。

与现有组名称的冲突将通过自动重命名现有组并更新帖子中的组提及来处理。

关于标签和分类权限?

这些权限将保持不变,因为它们的“所有人”概念在几个方面有所不同,且不依赖于底层的自动组。

6 个赞

等等……这是怎么回事😳 这是否意味着,当该功能启用后,所有当前对公众(所有人)开放的类别都将变为需要登录才能访问的封闭类别?

[quote=“martin, post:1, topic:402273”]
任何将 everyone 选为指定组的设置,都会自动转换为 logged_in_users ID。[/quote]

不,因为:

这仅影响当前允许你选择“所有人”的群组列表类型站点设置,如下所示:

1 个赞

有人能帮我理解我需要如何调整我的主题组件吗?

我尝试以 copy-post 组件为例,因为我记得它也使用了一个组设置来授予对该功能的访问权限。而且当时有一个 问题,因为“所有人”(everyone)这个伪组需要单独检查,就像在我的组件中一样,因为仅仅比较用户所属组的 ID 没有帮助——这些 ID 需要单独检查。因此,我预期那里最近会有变更,因为据我理解,新组也是伪组,其 ID 也需要单独检查。我是否遗漏了什么,导致这里不需要这样做?

我的 favorite filters 组件有两个组设置:一个允许组保存自己的过滤器,另一个提供标准过滤器。
默认情况下,只有 trust_level_0 组的成员可以使用自定义过滤器,因为只有注册用户才能在自定义用户字段中存储数据。因此,在这里,如果我不允许选择 anonymous_users,将是合理的。在主题组件中该如何实现这一点?是否已有相关示例?

默认过滤器的默认设置是“所有人”(everyone),因为我认为即使未注册用户也能查看和使用默认过滤器是有帮助的。问题是,尽管我明确选择了“所有人”,它却变成了“已登录用户”(logged_in_users)。我是否需要为此创建一个自定义迁移,以便当前使用“所有人”的管理员在未来仍能为未注册用户保留过滤器?这个迁移需要在什么时候执行?还是说,在你运行迁移后,每个管理员都需要单独更改这个设置?

我所担心的这些是否实际上是不必要的?如果需要调整,考虑到可能受影响的社区维护组件数量,不到四周的时间似乎相当短。
除了“copy-post”,我还查看了 unanswered filter 组件,但也没有在那里发现任何变更。感觉我似乎忽略了某些重要的东西。毕竟,该变更已默认启用近一周了。因此我假设,如果需要调整,官方组件应该已经更新了。

1 个赞

3 篇帖子已合并到现有主题:现代化 Foundation 主题

查看这些组件,currentUser?.groups 无论如何都不可靠,因为它仅包含用户的可见群组,而可能影响权限的所属群组可能并未在此处序列化:

我们在核心插件中通过在当前用户序列化器中执行类似以下操作来解决这个问题:

但显然,主题组件和主题及其设置无法使用此方法。

嗯,我不太确定,需要再想想。如果你确实是指 everyone,那么它需要同时更改为 logged_in_usersanonymous_users。正如原帖所述,这是 everyone 的主要问题——有些人认为它仅指已登录用户,而另一些人则认为它指已登录用户加匿名用户,这非常依赖于具体情境。

我选择了“仅已登录用户”这一解释,因为从安全角度来看这更稳妥。

不,我只是没考虑到主题组件和主题及其设置会如何受到此更改的影响,我当时主要关注的是站点设置。像这类问题尤其难以发现,因为它甚至没有使用 AUTO_GROUPS 常量:

image

总之,我会针对这些问题想出一些解决方案,在找到解决方法之前,我不会将此更改推进到稳定版。

2 个赞