这是 Granular group-based permissions for anonymous and logged in users 的配套话题,目前仍在完善中(WIP)。
在核心代码、插件和主题的各种代码库中,仍有少数地方直接引用了 everyone 或组 ID 0,而没有考虑到即将进行的这项更改,或者没有使用 user.in_any_groups? 或用于处理此问题的各种 guardian 方法。
供快速参考,以下是一些自动组 ID:
0-everyone1-admins2-moderators3-staff4-anonymous_users5-logged_in_users
随着我们接近稳定版本,本话题将作为跟踪此系统修复情况的中心位置。Discourse 客户的自定义插件和主题不在此处跟踪,我会在内部维护一份单独的列表。
高优先级问题
Moin 提出的问题:
- 核心
- 关于 -
apply_excluded_groups仅用于从about_page_hidden_groups中的组里隐藏选定的版主和管理员。像0|4|5这样的伪组在这里没有意义,它们应该被添加到disallowed_groups中。我们还需要更新设置描述,因为它具有误导性。 - EditCategoryTabsController - 在
_wouldLoseAccess中 https://github.com/discourse/discourse/blob/86552acfbaf816db3b9db5f761f5e9f2bd221c21/frontend/discourse/admin/controllers/edit-category/tabs.js#L382-L388 我们只查看了可见组,这应该像 ACL 的evaluate一样进行服务器端检查
- 关于 -
核心插件
- Discourse Templates
-
can_use_private_templates?仍然直接引用everyone,并且没有使用站点设置的_map简写。
-
- Discourse AI
-
- guardian 扩展中的
can_see_summary?没有使用user.in_any_groups?
- guardian 扩展中的
-
- AiBot::Playground 中的
can_attach?没有使用user.in_any_groups?
- AiBot::Playground 中的
-
ai-translation-topic-admin中的addTopicAdminMenuButton在客户端查看currentUser.groups,这不可靠,应改为对content_localization_allowed_groups进行服务器端检查
-
- Discourse Assign。这里有相当多的问题。
- 在
AssignmentPermissions中,应该使用user_ids_in_groups而不是user_ids_in_groups(注:原文此处重复,保留原意) assign_allowed_on_groups应该在disallowed_groups中添加0|4|5,这些在这里都没有意义,只有具体组才重要。
- 在
其他插件
- Activity Pub
- 移除
showStatusToUser中对user.groups和everyone的客户端检查。将activity_pub_post_status_visibility_groups的默认值更改为4|5。
- 移除
- Suggested Edits
user_in_suggested_edits_group?需要在GuardianExtensions中使用user.in_any_groups?。在suggested_edits_review_groups的mandatory_groups中添加1,并移除can_review_suggested_edits_in_topic_list中的管理员特殊情况。- 在
suggested_edits_review_groups和suggested_edits_suggest_groups的disallowed_groups中添加0|4|5,此设置并不真正打算与这些伪组一起使用
- Resenha
- 移除
public_room_message_bus_targets中的untargetable_group_ids变通方法,因为这在 FIX: Handle new pseudogroups in message bus group IDs (#42610) · discourse/discourse@699ad46 · GitHub 中已经得到解决 - 将
resenha_allowed_groups的默认值从0更改为4|5
- 移除
主题
组件
低优先级问题
- 核心
TopicGuardian中的is_in_edit_topic_groups应该使用站点设置的_map扩展Roleable#whisperer?应该使用user.in_any_groups?并移除管理员检查,在whispers_allowed_groups设置中作为mandatory_values添加1- 在
allow_solved_in_groups站点设置的disallowed_groups中添加0|4,这只处理私信 - 在
about_page_extra_groups的disallowed_groups中添加0|4|5,这是专门用于在关于页面处理具体组的 - 在
PresenceChannel的can_view?中注明,当即将进行的更改移动到Permanent时,我们需要移除Group::AUTO_GROUPS[:everyone]检查
核心插件
- Chat
- 在聊天自动加入/自动离开逻辑和
users_with_unreads中的everyone_allowed各处注明,当即将进行的更改移动到Permanent时,移除:everyone检查 - 更新
Chat::Publisher中的chat_allowed_group_ids以移除特殊伪组,因为如 FIX: Handle new pseudogroups in message bus group IDs - Pull Request #42610 - discourse/discourse - GitHub 所示,MessageBus 现在可以正确处理伪组
- 在聊天自动加入/自动离开逻辑和
- Assign
- 移除 plugin.rb 中的
add_model_callback(Group),它是查看组名称而不是 ID 的无关/死代码
- 移除 plugin.rb 中的
其他插件
- Code Review
- 对
code_review_allowed_groups的can_review_code?检查没有使用_map扩展,也没有使用user.in_any_groups?。在该设置的mandatory_groups中添加1,并移除 guardian 中的特殊管理员检查。在disallowed_groups中添加0|4|5。
- 对
- Needs Love
- 对
needs_love_allowed_groups的can_needs_love?检查没有使用_map扩展,也没有使用user.in_any_groups?。在该设置的mandatory_groups中添加1,并移除 guardian 中的特殊管理员检查。在disallowed_groups中添加0|4|5。
- 对
- Staff Alias
- 对
staff_alias_allowed_groups的can_post_as_staff_alias检查没有使用_map扩展,也没有使用user.in_any_groups?。在disallowed_groups中添加0|4|5
- 对
主题
组件
迁移的后续步骤
待定