OpenProject 权限指南:项目权限与全局权限的完整解析
2026/9/17 22:35:02 网站建设 项目流程

OpenProject 权限指南:项目权限与全局权限的完整解析

【免费下载链接】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 系统管理员手册中的 Permissions guide 为核心,系统梳理 OpenProject 中全部权限项的含义、依赖关系与生效条件,并结合仓库源码(config/initializers/permissions.rb 与 lib/open_project/access_control.rb)揭示权限定义与校验的底层机制。读完本文,你将能准确理解每一个权限的实际作用,正确配置项目角色与全局角色,并避免因模块未启用或权限依赖缺失而导致的授权失效问题。

权限模型概览

在 OpenProject 中,权限(Permission)决定了用户能看到什么能做什么。权限本身并不直接分配给用户,而是通过两类角色间接授予:

  • 项目角色(Project roles):在具体项目内生效,承载绝大多数业务权限(查看/编辑工作包、管理成员、配置项目设置等);
  • 全局角色(Global roles):在整个实例范围内生效,用于跨项目的管理类操作。

[!TIP] 部分权限只有在对应模块已在该项目启用时才有效。如果某个模块被禁用,其关联权限会被直接忽略。从源码看,这一机制由AccessControl.disable_modules_permissions(module_name)实现——当模块被禁用时,会将其下所有权限标记为disabled并从有效权限集合中剔除(见 lib/open_project/access_control.rb)。

权限定义统一登记在 config/initializers/permissions.rb 中,每个权限声明包含:对应的控制器动作(controller actions)、生效范围(permissible_on,如:project:work_package)、依赖权限(dependencies)、成员要求(require)以及用于数据层校验的contract_actions

项目权限(Project permissions)

以下权限均作用于项目本身,通常授予承担项目管理和配置职责的角色。

  • Archive project(归档项目):允许用户归档和恢复(取消归档)一个项目。

  • Edit project(编辑项目):允许用户进入项目设置并编辑项目配置。源码中该权限覆盖了projects/settings/generalprojects/settings/storageprojects/settings/work_packagesprojects/settings/templateprojects/status等一批设置控制器动作,并要求用户为项目成员(见 config/initializers/permissions.rb)。

  • Select project modules(选择项目模块):允许用户启用或禁用项目模块,对应projects/settings/modules控制器动作。

  • View project attributes(查看项目属性):允许用户查看项目信息与属性,依赖View project权限(dependencies: :view_project)。

  • Export projects(导出项目):允许用户导出项目信息,依赖View project权限。

  • Edit project attributes(编辑项目属性):允许用户在项目概览页编辑项目属性,依赖View project attributes

  • Select project attributes(选择项目属性):允许用户配置项目可用哪些属性(即项目自定义字段的勾选)。

  • View project phases(查看项目阶段):允许用户查看项目生命周期阶段,依赖View project(见 config/initializers/permissions.rb)。

  • Edit project phases(编辑项目阶段):允许用户编辑项目生命周期阶段,依赖View project phases

  • Select project phases(选择项目阶段):允许用户激活或停用项目阶段。停用的阶段会从项目概览和项目列表中隐藏,对应projects/settings/life_cycle_steps控制器动作,依赖Edit project phases(见 config/initializers/permissions.rb)。

  • Manage members(管理成员):允许用户添加、移除项目成员并管理其角色。该权限覆盖members控制器的增删改查全套动作,依赖View members(见 config/initializers/permissions.rb)。

  • Invite members by email(通过邮箱邀请成员):允许用户通过邮箱邀请项目成员。这里的"成员"既包括 OpenProject 实例中的新用户,也包括因当前 用户可见性设置 而对邀请者不可见的已有用户。

    [!NOTE] 该权限依赖 Manage members 权限(源码中声明为dependencies: :manage_members,见 config/initializers/permissions.rb),单独授予无法生效。

  • View members(查看成员):允许用户查看项目成员列表。

  • Manage versions(管理版本):允许用户创建、编辑和删除项目版本。

  • Select types(选择类型):允许用户配置项目中可用的工作包类型。

  • Select custom fields(选择自定义字段):允许用户配置项目中可用的自定义字段。

  • Create subprojects(创建子项目):允许用户创建子项目。

  • Copy projects(复制项目):允许用户通过复制已有项目来创建新项目;对于项目模板,该权限也允许用户基于模板创建项目。

    [!NOTE] 用户复制项目时,会在新项目中被授予配置中设定的"New role for users that create projects"(创建项目的用户的新角色)。根据配置不同,该角色可能比用户在源项目中的角色拥有更多权限。此外,要从项目设置中访问Copy操作,用户通常还需要Edit project权限以打开项目设置;另一种方式是直接基于项目模板创建新项目。

  • Manage dashboards(管理仪表盘):允许用户创建和编辑项目仪表盘。

  • Manage files in project(管理项目中的文件):允许用户管理项目文件存储。

  • Automatically managed project folders: Read files(自动管理项目文件夹:读取文件):允许用户读取自动管理项目文件夹中的文件。

  • Automatically managed project folders: Write files(自动管理项目文件夹:写入文件):允许用户修改自动管理项目文件夹中的文件。

  • Automatically managed project folders: Create files(自动管理项目文件夹:创建文件):允许用户在自动管理项目文件夹中创建文件。该权限仅适用于 Nextcloud 文件存储

  • Automatically managed project folders: Delete files(自动管理项目文件夹:删除文件):允许用户删除自动管理项目文件夹中的文件。仅适用于 Nextcloud 文件存储

  • Automatically managed project folders: Share files(自动管理项目文件夹:共享文件):允许用户共享自动管理项目文件夹中的文件。仅适用于 Nextcloud 文件存储

工作包与甘特图权限(Work packages and Gantt chart)

工作包是 OpenProject 的核心数据对象,因此这类权限数量最多、粒度和依赖也最细。多数动作型权限都声明了dependencies: :view_work_packages——即必须先拥有View work packages才能执行创建、编辑、删除等操作。

  • View work packages(查看工作包):查看工作包的权限。它是整个工作包权限族的基础,源码中覆盖work_packagesversionsjournals以及work_packages_api等大量控制器动作,并声明contract_actions: { work_packages: %i[read] }(见 config/initializers/permissions.rb)。

  • Add work packages(添加工作包):创建工作包,依赖View work packages

  • Edit work packages(编辑工作包):编辑工作包,依赖View work packages

  • Move work packages(移动工作包):在项目之间移动工作包,依赖View work packages

  • Duplicate work packages(复制工作包):复制(克隆)工作包,依赖View work packages

  • Add comments(添加评论):在工作包上添加评论,依赖View work packages

  • Edit own comments(编辑自己的评论):编辑本人创建的评论,依赖View work packages

  • Moderate comments(审核评论):编辑任意用户创建的评论。

    [!IMPORTANT] 拥有该权限的用户可以编辑其他用户创建的评论,需谨慎授予。

  • View internal comments(查看内部评论):允许用户查看内部评论。内部评论(Internal comments)是 OpenProject 企业版(Enterprise add-on)功能,只有拥有该权限的用户才能看到,相关说明见 用户指南中的内部评论章节。

  • Write internal comments(编写内部评论):允许用户创建内部评论,依赖View internal comments

  • Edit own internal comments(编辑自己的内部评论):允许用户编辑本人创建的内部评论,依赖View internal comments

  • Moderate internal comments(审核内部评论):允许用户编辑任意用户创建的内部评论。

    [!IMPORTANT] 拥有该权限的用户可以编辑其他用户创建的内部评论。

  • Add attachments(添加附件):允许用户向工作包上传附件。

    [!NOTE] 该权限独立于 Edit work packages生效。源码注释明确说明:"WP attachments can be added with:edit_work_packages, this permission allows it without Edit WP as well"(见 config/initializers/permissions.rb)。也就是说,即使角色没有编辑权限,也可以单独授予附件上传权限。

  • Manage work package categories(管理工作包类别):允许用户创建、编辑和删除工作包类别。

  • Export work packages(导出工作包):允许用户导出工作包,依赖View work packages

  • Delete work packages(删除工作包):允许用户删除工作包,依赖View work packages,并要求为项目成员。

  • Manage work package relations(管理工作包关系):允许用户创建、编辑和移除工作包关系。

  • Manage work package hierarchies(管理工作包层级):允许用户管理工作包之间的父子关系(对应源码中的manage_subtasks权限与work_package_hierarchy_relations控制器,见 config/initializers/permissions.rb)。

  • Manage public views(管理公共视图):允许用户创建、编辑和删除公共工作包视图。该权限同时影响其他与工作包相关的公共视图,例如 Team planner 和日历的公共视图。

  • Save views(保存视图):允许用户保存个人工作包视图(对应save_queries权限,见 config/initializers/permissions.rb)。

  • View watchers list(查看关注者列表):允许用户查看谁在关注某个工作包。

  • Add watchers(添加关注者):允许用户为工作包添加关注者。

  • Delete watchers(移除关注者):允许用户移除工作包的关注者。

  • Share work packages(共享工作包):允许用户与其他用户共享工作包。该权限依赖Edit work packagesView work package shares(见 config/initializers/permissions.rb)。

  • View work package shares(查看工作包共享):允许用户查看已有的工作包共享,对应contract_actions: { work_package_shares: %i[index] }

  • Assign versions(分配版本):允许用户为工作包分配版本。

  • Change work package status(更改工作包状态):允许用户更改工作包状态。

    [!NOTE] 该权限独立于 Edit work packages生效。源码注释同样说明:状态变更权限可以在不授予编辑权限的情况下单独授权(见 config/initializers/permissions.rb)。

  • Become assignee/responsible(成为负责人/责任人):允许工作包被指派给在项目中拥有该角色的用户或用户组。

    [!NOTE] 这是一个被动权限。源码注释对此有精确定义:"A user having the permission isn't eligible to perform actions but rather to have actions taken together with him/her"——即拥有该权限的用户不是去执行某个操作,而是可以被选为工作包的负责人(assignee)或责任人(responsible)(见 config/initializers/permissions.rb)。并且该权限声明了grant_to_admin: false,即管理员也不会自动获得被指派资格。

  • View file links(查看文件链接):允许用户查看附加在工作包上的文件链接。

  • Manage file links(管理文件链接):允许用户创建、编辑和移除文件链接。

  • Manage wiki page links(管理 Wiki 页面链接):允许用户创建、编辑和移除 Wiki 页面链接。

其他模块权限

以下权限按功能模块划分,均要求对应模块在项目中启用后才生效。

Boards 看板

  • View boards(查看看板):允许用户查看看板。
  • Manage boards(管理看板):允许用户创建、编辑和删除看板。

Backlogs 敏捷积压

  • View sprints(查看冲刺):允许用户查看冲刺。
  • Select backlog types and statuses(选择积压类型与状态):允许用户配置哪些工作包类型出现在积压中、哪些状态被视为已完成。
  • Create sprints(创建冲刺):允许用户创建冲刺。
  • Start/complete sprint(开始/完成冲刺):允许用户开始和完成冲刺。
  • Manage sprint items(管理冲刺条目):允许用户管理冲刺内容。
  • Share sprint(共享冲刺):允许用户共享冲刺信息。

Budgets 预算

  • View budgets(查看预算):允许用户查看项目预算。
  • Edit budgets(编辑预算):允许用户创建、编辑和删除项目预算。

Calendars 日历

  • View calendars(查看日历):允许用户查看日历。
  • Edit calendars(编辑日历):允许用户创建、编辑和删除日历。
  • Subscribe to iCalendars(订阅 iCalendar):允许用户订阅日历订阅源。

Documents 文档

  • View documents(查看文档):允许用户查看项目文档。
  • Manage documents(管理文档):允许用户创建、编辑和删除项目文档。

Forums 论坛

  • Manage forums(管理论坛):允许用户创建、编辑和删除论坛。
  • Post messages(发布消息):允许用户在论坛发布消息。
  • Edit messages(编辑消息):允许用户编辑任意论坛消息。
  • Edit own messages(编辑自己的消息):允许用户编辑自己的论坛消息。
  • Delete messages(删除消息):允许用户删除任意论坛消息。
  • Delete own messages(删除自己的消息):允许用户删除自己的论坛消息。

GitHub / GitLab 集成

  • Show GitHub content(显示 GitHub 内容):允许用户查看 GitHub 集成内容。
  • Show GitLab content(显示 GitLab 内容):允许用户查看 GitLab 集成内容。

Meetings 会议

  • View meetings(查看会议):允许用户查看会议。
  • Create meetings(创建会议):允许用户创建会议。
  • Edit meetings(编辑会议):允许用户编辑会议。
  • Delete meetings(删除会议):允许用户删除会议。
  • Send meeting invites and outcomes to participants(向与会者发送会议邀请和结果):允许用户向与会者发送会议邀请与会议结果。
  • Manage agendas(管理议程):允许用户创建、编辑和删除议程项。
  • Manage outcomes(管理会议结果):允许用户创建、编辑和删除会议结果。

News 新闻

  • Manage news(管理新闻):允许用户创建、编辑和删除新闻。
  • Comment news(评论新闻):允许用户评论新闻。

Team planner 团队规划器

  • View team planner(查看团队规划器):允许用户查看 Team planner。
  • Manage team planner(管理团队规划器):允许用户创建、编辑和配置 Team planner。

Time and costs 工时与成本

  • View spent time(查看已记录工时):允许用户查看所有已记录工时。
  • View own spent time(查看自己的工时):允许用户查看自己的工时。
  • Log own time(记录自己的工时):允许用户记录自己的工时。
  • Log time for other users(为其他用户记录工时):允许用户代他人记录工时。
  • Edit own time logs(编辑自己的工时记录):允许用户编辑自己的工时条目。
  • Edit time logs for other users(编辑其他用户的工时记录):允许用户编辑其他用户创建的工时条目。
  • Manage project activities(管理项目活动):允许用户创建、编辑和删除用于工时跟踪的项目活动。
  • View own hourly rate(查看自己的时薪):允许用户查看自己的时薪。
  • View all hourly rates(查看所有时薪):允许用户查看所有用户的时薪。
  • Edit own hourly rates(编辑自己的时薪):允许用户编辑自己的时薪。
  • Edit hourly rates(编辑时薪):允许用户编辑所有用户的时薪。
  • View cost rates(查看成本费率):允许用户查看成本费率。
  • Book unit costs for oneself(为自己登记单位成本):允许用户为自己登记单位成本。
  • Book unit costs(登记单位成本):允许用户为其他用户登记单位成本。
  • Edit own booked unit costs(编辑自己登记的单位成本):允许用户编辑自己登记的单位成本。
  • Edit booked unit costs(编辑已登记的单位成本):允许用户编辑所有用户登记的单位成本。
  • View booked costs(查看已登记成本):允许用户查看所有已登记成本。
  • View own booked costs(查看自己登记的成本):允许用户查看自己登记的成本。
  • Save public cost reports(保存公共成本报表):允许用户保存公共成本报表。
  • Save private cost reports(保存私有成本报表):允许用户保存私有成本报表。

Wiki

  • View wiki(查看 Wiki):允许用户查看 Wiki 页面。
  • View wiki history(查看 Wiki 历史):允许用户查看 Wiki 页面的修订历史。
  • Edit wiki pages(编辑 Wiki 页面):允许用户创建和编辑 Wiki 页面。
  • Manage wiki(管理 Wiki):允许用户管理项目 Wiki,包括重命名和删除 Wiki 页面。

常见权限依赖关系

部分权限之间存在隐含依赖,或行为并不直观。官方文档将其汇总为下表,务必在配置角色时核对:

权限附加说明
Invite members by email需要Manage members权限。
Copy projects用户在复制出的项目中被授予配置的New role for users that create projects角色。从项目设置访问Copy通常还需要Edit project权限。
Add attachments可以独立于Edit work packages授予。
Change work package status可以独立于Edit work packages授予。
Become assignee/responsible控制用户或用户组能否被选为工作包的负责人(assignee)或责任人(responsible)。

这些依赖关系并非仅停留在文档层面,而是直接在源码中强制声明。以 config/initializers/permissions.rb 为例,可以清晰看到dependencies字段的用法:

  • invite_members_by_emaildependencies: :manage_members(第 L219-L223 行);
  • add_work_packagesedit_work_packagesdelete_work_packagesmove_work_packages→ 均依赖view_work_packages
  • view_project_phasesdependencies: :view_projectselect_project_phasesdependencies: :edit_project_phases,形成"查看 → 编辑 → 选择"的递进链条(第 L187-L207 行);
  • share_work_packagesdependencies: %i[edit_work_packages view_shared_work_packages],是一个多依赖示例(第 L521-L527 行);
  • add_internal_commentsdependencies: %i[view_project view_internal_comments](第 L427-L432 行)。

源码视角:权限是如何定义与校验的

理解权限在源码中的存在形式,有助于在配置时预判行为。

1. 权限声明文件

所有权限在 config/initializers/permissions.rb 中通过map.permission或模块内的wpt.permission声明。一个完整的权限声明包含以下关键属性:

  • 控制器动作(controller actions){ "projects/settings/general": %i[show update] }之类的 Hash,将权限绑定到具体的控制器与动作,用于请求级的鉴权;
  • permissible_on:权限的生效范围,如:project:work_package:global。例如view_work_packages声明为permissible_on: %i[work_package project],意味着它在工作包级和项目级都能生效;
  • dependencies:前置权限列表,缺少前置权限则该权限无法独立起作用;
  • require:访问门槛,如:member(必须为项目成员)、:loggedin(必须登录);
  • contract_actions:映射到数据校验契约(Contract)的动作,用于服务层/数据层的写入校验,如work_packages: %i[read create update move copy]
  • public/grant_to_admin:标记公共权限,或是否自动授予管理员。

2. 权限注册与查询引擎

lib/open_project/access_control.rb 是权限的运行时注册表与查询入口。它的核心职责包括:

  • map(第 L34-L45 行):收集初始化阶段声明的权限、模块与无权限模块,并清空缓存;
  • permissions/project_permissions/global_permissions(第 L57-L131 行):按类型筛选出当前启用的权限集合,区分项目权限与全局权限;
  • permission(action)(第 L67-L75 行):支持按权限名(Symbol)或按{controller:, action:}哈希反查权限,是请求鉴权的基础;
  • allowed_actions/allow_actions(第 L78-L87 行):查询某权限允许的控制器动作;
  • disabled_project_modules/disable_modules_permissions(第 L149-L205 行):当模块被配置禁用时,自动剔除其关联权限,这正是"模块未启用时相关权限被忽略"这一文档提示的底层实现;
  • contract_actions_map(第 L177-L189 行):将权限映射为数据契约动作,供写入校验使用。

3. 角色与权限的关联

权限最终通过角色(Role)授予用户:项目角色包含一组项目权限,全局角色包含一组全局权限。角色成员关系由Member/MemberRole模型承载(见 app/models/member.rb 与 app/models/member_role.rb),管理员在项目设置 → 成员系统管理 → 角色与权限中为角色勾选权限即可完成授权。系统管理员还可以在系统管理 → 权限报告中按角色查看权限的授予概况(相关截图与说明见 权限报告指南)。

配置实践建议

结合文档提示与源码行为,配置角色时应注意以下几点:

  1. 先启用模块,再分配权限:如果某模块(如 Boards、Meeting、Wiki)未在项目中启用,其全部权限即使勾选也不会产生任何效果。可在项目设置 → 项目模块中调整。
  2. 核对依赖链:许多"高级"权限(编辑阶段、选择阶段、邀请成员等)依赖其前置权限。若用户"明明有权限却无法操作",优先检查依赖权限是否齐全。
  3. 善用独立权限实现精细授权Add attachmentsChange work package status都可以独立于Edit work packages授予,适合"允许上传附件/变更状态,但不允许修改工作包其他内容"的受限场景。
  4. 留意被动权限Become assignee/responsible不赋予任何操作能力,只决定该角色成员能否被指派为负责人/责任人,且该权限不会自动授予管理员,配置时容易遗漏。
  5. 理解复制项目时的角色变化Copy projects会把用户以New role for users that create projects角色带入新项目,复制场景下授予的权限可能超出源项目角色范围,需在系统设置中确认该默认角色的权限集合。

相关文档

  • 权限报告指南:按角色查看权限授予情况
  • 角色与权限:角色管理与全局角色
  • 用户可见性设置:影响"通过邮箱邀请成员"权限的作用范围
  • 权限常见问题:权限相关的常见问题解答
  • 权限定义源码:config/initializers/permissions.rb
  • 权限注册与查询引擎:lib/open_project/access_control.rb

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询