OpenProject 15.0.2 版本发布解析:SAML 注册限制与 OIDC 作用域等九项缺陷修复详解
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
OpenProject 15.0.2 是发布于 2024 年 11 月 20 日的补丁版本,聚焦于稳定性与缺陷修复,官方明确建议所有用户升级到该版本。本指南将逐条拆解本次发布包含的九项 Bugfix,并结合本仓库源码说明其底层实现(尤其是 SAMLlimit_self_registration与 OpenID Connect 自定义 scopes 两条修复链路),帮助读者理解每条修复的影响面、验证方式与升级价值。
版本概览与升级建议
| 项目 | 说明 |
|---|---|
| 版本号 | 15.0.2 |
| 发布日期 | 2024-11-20 |
| 版本性质 | 缺陷修复(Bugfix)版本 |
| 升级建议 | 官方推荐升级至最新版本(见 docs/release-notes/15/15-0-2/README.md) |
15.0.2 不引入新功能特性,而是针对 15.0 主线中暴露的一系列问题做收敛修复。修复范围横跨**工作包活动流、前端交互、文件存储(Storages)与身份认证(SAML / OpenID Connect)**四大领域,其中身份认证相关修复(共 5 项,占半数以上)直接关系到企业级部署中单点登录的可用性,是本版本升级价值最大的部分。
工作包与前端交互类修复(4 项)
聚合包含评论时,工作包创建事件不显示
修复编号:Bugfix #58738
问题表现:当工作包活动流(Activity/Journal)的聚合设置中包含评论时,工作包的"创建"事件无法在活动流中正常展示。
源码依据:该问题涉及工作包活动流的聚合(aggregation)逻辑。OpenProject 通过 Journal 机制记录工作包的全部变更,活动流在渲染时会对相邻时间内的变更做聚合展示,聚合规则需要同时正确处理评论(Comment)与创建(Creation)事件。当聚合条件包含评论时,创建事件的展示分支被遗漏,从而出现"创建记录消失"的现象。本次修复后,无论聚合中是否包含评论,创建事件都会独立、完整地呈现。
错误提示 Toast 出现 500 而无详细信息
修复编号:Bugfix #59065
问题表现:部分操作失败时,界面错误 Toast 直接展示 HTTP 500 状态码,却没有携带任何可供排查的细节信息,导致管理员与用户无法判断失败原因。
修复价值:该修复旨在改善错误信息的可读性与可诊断性,使 Toast 至少能够呈现可操作的错误摘要,降低排障成本。涉及前端错误处理链路(见 frontend/src 下错误提示相关实现)。
评论框提交后保持打开且不失去焦点
修复编号:Bugfix #59279
问题表现:用户提交评论后,评论输入框仍然保持打开状态、焦点未移除,容易造成重复提交或误以为提交失败的错觉。
修复价值:改进提交后的交互状态管理,提交完成后评论框应正常收起并释放焦点,属于典型的表单生命周期(submit 后 reset/blur)缺陷修复。
列表视图跳转分屏活动标签时滚动位置错误
修复编号:Bugfix #59281
问题表现:从列表视图打开工作包分屏(Split Screen)并切换到"活动(Activity)"标签页时,页面没有滚动到正确的位置,用户需要手动滚动才能看到目标活动。
修复价值:修正分屏视图下活动标签页的锚点定位与滚动行为,属于前端视图滚动位置计算类缺陷修复。
文件存储:复制项目后 Project Folder 设置丢失
修复编号:Bugfix #59344
问题表现:当用户复制(Copy)一个项目时,复制出的项目中所包含的文件存储(Storages,如 Nextcloud)没有继承源项目正确的Project Folder(项目文件夹)设置,导致新项目无法直接使用既定的文件夹结构。
修复价值:项目复制流程必须完整迁移文件存储关联及其项目文件夹配置。文件存储模块的存储管理、项目存储关联(ProjectStorage)与项目文件夹(Project Folder)配置相关实现位于 modules/storages,其包含项目存储的 active/automatic 状态、project_folder_id等字段与校验逻辑,本次修复确保复制动作按源项目配置重建文件夹关联。
身份认证类修复(5 项)
本版本最值得关注的是围绕SAML 提供方的limit_self_registration(限制自助注册)展开的三连修复,以及 OpenID Connect 自定义 scopes 的修复,它们共同补齐了第三方登录配置在管理界面与迁移过程中的一致性短板。
SAML:无法修改 limit_self_registration
修复编号:Bugfix #59370
问题表现:管理员在 SAML 提供方配置界面保存时,limit_self_registration字段的修改无法被提交并持久化。
源码依据:该字段属于 SAML 提供方模型(Saml::Provider)的顶层属性,而非options存储内的子属性。从源码可以看到,其提交与校验链路是独立的:
- 控制器参数白名单明确放行了该字段:modules/auth_saml/app/controllers/saml/providers_controller.rb 中
permit(:display_name, :limit_self_registration, *Saml::Provider.stored_attributes[:options]),即limit_self_registration与options存储属性并列允许; - 契约层将
limit_self_registration声明为独立属性:modules/auth_saml/app/contracts/saml/providers/base_contract.rb; - 配置表单为其渲染专用开关控件:modules/auth_saml/app/forms/saml/providers/configuration_form.rb。
修复前该字段在部分更新场景下会被丢弃,修复后管理界面的修改可正常生效。
SAML:limit_self_registration 配置未被实际遵守
修复编号:Bugfix #59375
问题表现:即使管理员为 SAML 提供方设置了limit_self_registration,登录流程中该限制也没有被真正执行。
源码依据:该配置在配置映射阶段被显式处理为布尔值。在 modules/auth_saml/app/services/saml/configuration_mapper.rb 的call!方法中:
def call! options = mapped_options(configuration.deep_stringify_keys) { "options" => options, "slug" => options.delete("name"), "limit_self_registration" => ActiveModel::Type::Boolean.new.cast(options.delete("limit_self_registration")), "display_name" => options.delete("display_name") || "SAML" }.compact end可以看到limit_self_registration从原始配置中取出后经ActiveModel::Type::Boolean转换为真正的布尔值,再作为顶层字段写入提供方记录。同时 modules/auth_saml/app/models/saml/provider/hash_builder.rb 在哈希构建(用于登录回调认证决策)时也会携带该值。修复确保该布尔开关在登录/注册决策链路中被真正读取与执行,而非仅仅被存储。
SAML:迁移不保留 limit_self_registration
修复编号:Bugfix #59403
问题表现:通过迁移(如从旧版配置迁移、或从环境变量种子导入)创建的 SAML 提供方,其limit_self_registration设置会丢失。
源码依据:上述ConfigurationMapper正是迁移与种子导入场景使用的配置映射器。修复前映射过程对limit_self_registration的处理存在缺口,导致迁移后该字段为空;修复后call!输出结构中显式包含该键(见上文代码片段),并以.compact在空值时安全省略,保证迁移前后配置语义一致。相关的迁移行为在 modules/auth_saml/spec/services/saml/configuration_mapper_spec.rb 中有对应测试覆盖。
OpenID Connect:允许设置自定义 scopes
修复编号:Bugfix #59430
问题表现:OpenID Connect(OIDC)提供方此前无法自定义请求的 scopes(授权范围),导致部分身份提供方要求的自定义 scope(如组织专属权限声明)无法获取。
源码依据:OpenID Connect 提供方模型(modules/openid_connect/app/models/openid_connect/provider.rb)通过store_attribute将scope存储为options内的字符串属性,并带有默认值:
store_attribute :options, :scope, :string, default: "openid email profile"同时提供将 scope 字符串切分为数组的访问器:
def scopes (scope || "").split end修复后,管理员可以在提供方配置中自由覆盖 scope 值(例如追加offline_access或自定义 scope),scopes方法会按空格切分后用于 OIDC 授权请求;当值为空时安全回退为[]。由于默认值为openid email profile,未做修改的既有配置行为保持不变,不存在兼容性回退问题。
完整变更清单
以下为本版本全部缺陷修复的汇总表(编号与官方跟踪系统对应):
| 编号 | 类型 | 修复内容 | 所属模块 |
|---|---|---|---|
| #58738 | Bugfix | 聚合包含评论时工作包创建事件不显示 | 工作包活动流 |
| #59065 | Bugfix | 错误 Toast 只显示 500 而无详细信息 | 前端错误处理 |
| #59279 | Bugfix | 评论框提交后保持打开且不失去焦点 | 前端交互 |
| #59281 | Bugfix | 分屏活动标签从列表视图跳转时滚动位置错误 | 分屏视图 |
| #59344 | Bugfix | 复制项目后存储的 Project Folder 设置不正确 | 文件存储(Storages) |
| #59370 | Bugfix | 无法修改 SAML 提供方的 limit_self_registration | 身份认证(SAML) |
| #59375 | Bugfix | SAML 提供方的 limit_self_registration 未被执行 | 身份认证(SAML) |
| #59403 | Bugfix | SAML 提供方迁移不保留 limit_self_registration | 身份认证(SAML) |
| #59430 | Bugfix | OpenID Connect 无法设置自定义 scopes | 身份认证(OIDC) |
结语
OpenProject 15.0.2 作为 15.0 主线的首个补丁迭代,核心价值在于修复了身份认证配置的一致性(SAML 注册限制的保存、执行与迁移三处断层)以及 OIDC 自定义 scopes 的能力缺口,同时清理了工作包活动流、分屏视图与错误提示等日常高频路径上的交互问题。对于已部署 15.0 的环境,建议参照官方建议升级至该版本,以获得上述全部修复;身份认证相关改动可从 modules/auth_saml 与 modules/openid_connect 两个模块的源码与测试用例中进一步追溯验证。
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考