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/general、projects/settings/storage、projects/settings/work_packages、projects/settings/template、projects/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_packages、versions、journals以及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 packages与View 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_email→dependencies: :manage_members(第 L219-L223 行);add_work_packages、edit_work_packages、delete_work_packages、move_work_packages→ 均依赖view_work_packages;view_project_phases→dependencies: :view_project,select_project_phases→dependencies: :edit_project_phases,形成"查看 → 编辑 → 选择"的递进链条(第 L187-L207 行);share_work_packages→dependencies: %i[edit_work_packages view_shared_work_packages],是一个多依赖示例(第 L521-L527 行);add_internal_comments→dependencies: %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),管理员在项目设置 → 成员或系统管理 → 角色与权限中为角色勾选权限即可完成授权。系统管理员还可以在系统管理 → 权限报告中按角色查看权限的授予概况(相关截图与说明见 权限报告指南)。
配置实践建议
结合文档提示与源码行为,配置角色时应注意以下几点:
- 先启用模块,再分配权限:如果某模块(如 Boards、Meeting、Wiki)未在项目中启用,其全部权限即使勾选也不会产生任何效果。可在项目设置 → 项目模块中调整。
- 核对依赖链:许多"高级"权限(编辑阶段、选择阶段、邀请成员等)依赖其前置权限。若用户"明明有权限却无法操作",优先检查依赖权限是否齐全。
- 善用独立权限实现精细授权:Add attachments与Change work package status都可以独立于Edit work packages授予,适合"允许上传附件/变更状态,但不允许修改工作包其他内容"的受限场景。
- 留意被动权限:Become assignee/responsible不赋予任何操作能力,只决定该角色成员能否被指派为负责人/责任人,且该权限不会自动授予管理员,配置时容易遗漏。
- 理解复制项目时的角色变化: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),仅供参考