细粒度权限
目录
Trac 具备一套通用机制,允许自定义权限策略以授予或拒绝对任何 Trac 资源,甚至特定版本资源的任何操作。
该机制是 Authz策略
,它是 tracopt.perm.authz_policy.*
中的一个可选组件,默认不激活。它可以通过 Trac 管理模块中的插件面板激活。
有关 Trac 权限和权限策略的更一般性介绍,请参阅Trac权限。
权限策略
可以实现各种各样的权限策略,Trac 也提供了一些示例。
活动的策略由一个配置设置决定
[trac] permission_policies = DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
在可选策略中,有#Authz策略,这是一种基于 Authz 风格系统的非常通用的权限策略。有关详细信息,请参阅authz_policy.py。
另一个权限策略#AuthzSource策略,使用 Subversion 定义的基于路径的授权来强制执行版本控制系统的权限。
另请参阅sample-plugins/permissions 获取更多示例。
Authz策略
配置
- 在服务器上一个安全的位置放置一个空的配置文件(
authzpolicy.conf
),该文件除 web 用户外,其他用户不可读。如果文件包含非 ASCII 字符,应使用 UTF-8 编码。 - 更新你的
trac.ini
文件- 修改
[trac]
节中的permission_policies选项[trac] permission_policies = AuthzPolicy, DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
- 添加一个新的
[authz_policy]
节,并将authz_file
选项指向该配置文件[authz_policy] authz_file = /some/trac/env/conf/authzpolicy.conf
- 通过Web管理界面或编辑
[components]
节来启用插件[components] tracopt.perm.authz_policy.* = enabled
- 修改
使用说明
请注意权限策略的指定顺序:策略按照提供的顺序执行,因此可能会覆盖先前的策略规范。
对于给定的权限检查,策略将返回 True
、False
或 None
。如果策略明确授予权限,则返回 True
。如果策略明确拒绝权限,则返回 False
。如果策略无法授予或拒绝权限,则返回 None
。
注意:只有当返回值为 None
时,才会咨询下一个权限策略。如果所有策略都没有明确授予权限,最终结果将是 False
,即权限被拒绝。
authzpolicy.conf
文件是一个 .ini
风格的配置文件
[wiki:PrivatePage@*] john = WIKI_VIEW, !WIKI_MODIFY jack = WIKI_VIEW * =
- 配置的每个节都是一个全局匹配模式,用于匹配 Trac 资源描述符。这些描述符的形式为
<realm>:<id>@<version>[/<realm>:<id>@<version> ...]
资源从左到右,从父级到子级排序。如果任何组件不适用,则用 *
代替。如果未明确指定版本模式,则隐式添加所有版本(@*
)。示例:匹配WikiStart页面
[wiki:*] [wiki:WikiStart*] [wiki:WikiStart@*] [wiki:WikiStart]
示例:匹配WikiStart上的附件 wiki:WikiStart@117/attachment:FOO.JPG@*
[wiki:*] [wiki:WikiStart*] [wiki:WikiStart@*] [wiki:WikiStart@*/attachment:*] [wiki:WikiStart@117/attachment:FOO.JPG]
- 节将按照它们在配置文件中出现的顺序与当前的 Trac 资源描述符进行检查。顺序至关重要。
- 一旦一个节匹配成功,当前用户名将按照顺序与该节的键(用户名)进行匹配。
- 如果键(用户名)以
@
开头,则将其视为一个组。 - 如果值(权限)以
!
开头,则该权限将被拒绝而不是授予。
- 如果键(用户名)以
用户名将使用正常的 Trac 权限规则匹配 'anonymous'(匿名)、'authenticated'(已认证)、<用户名> 或 '*' 中的任意一个。
注意:用户创建的其他组(例如,通过 web 界面页面管理 / 权限上的“将主题添加到组”)无法使用。有关此缺失功能的详细信息,请参阅#5648。 |
例如,如果 authz_file
包含
[wiki:WikiStart@*] * = WIKI_VIEW [wiki:PrivatePage@*] john = WIKI_VIEW * = !WIKI_VIEW
并且默认权限设置为这样
john WIKI_VIEW jack WIKI_VIEW # anonymous has no WIKI_VIEW
那么
- WikiStart的所有版本都将对所有人(包括匿名用户)可见
- PrivatePage 将仅对 john 可见
- 其他页面将仅对 john 和 jack 可见
组
[groups] admins = john, jack devs = alice, bob [wiki:Dev@*] @admins = TRAC_ADMIN @devs = WIKI_VIEW * = [*] @admins = TRAC_ADMIN * =
那么
- 所有内容都被阻止(白名单方式),但是
- 管理员在任何地方都拥有所有 TRAC_ADMIN 权限,并且
- 开发人员可以查看 wiki 页面。
一些仓库示例(特定于浏览源代码)
# A single repository: [repository:test_repo@*] john = BROWSER_VIEW, FILE_VIEW # John has BROWSER_VIEW and FILE_VIEW for the entire test_repo # The default repository (requires Trac 1.0.2 or later): [repository:@*] john = BROWSER_VIEW, FILE_VIEW # John has BROWSER_VIEW and FILE_VIEW for the entire default repository # All repositories: [repository:*@*] jack = BROWSER_VIEW, FILE_VIEW # Jack has BROWSER_VIEW and FILE_VIEW for all repositories
非常细粒度的仓库访问
# John has BROWSER_VIEW and FILE_VIEW access to trunk/src/some/location/ only [repository:test_repo@*/source:trunk/src/some/location/*@*] john = BROWSER_VIEW, FILE_VIEW # John has BROWSER_VIEW and FILE_VIEW access to only revision 1 of all files at trunk/src/some/location only [repository:test_repo@*/source:trunk/src/some/location/*@1] john = BROWSER_VIEW, FILE_VIEW # John has BROWSER_VIEW and FILE_VIEW access to all revisions of 'somefile' at trunk/src/some/location only [repository:test_repo@*/source:trunk/src/some/location/somefile@*] john = BROWSER_VIEW, FILE_VIEW # John has BROWSER_VIEW and FILE_VIEW access to only revision 1 of 'somefile' at trunk/src/some/location only [repository:test_repo@*/source:trunk/src/some/location/somefile@1] john = BROWSER_VIEW, FILE_VIEW
注意:为了让时间线对 John 可用/可见,我们必须在上述权限列表中添加 CHANGESET_VIEW。
缺失的功能
尽管使用默认权限策略处理(参见管理面板)是可能的,但细粒度权限仍然缺少那些分组功能(参见#9573, #5648)。部分补丁已可用,请参阅 authz_policy.2.patch,它是#6680的一部分。
你无法执行以下操作
[groups] team1 = a, b, c team2 = d, e, f team3 = g, h, i departmentA = team1, team2
权限组也不支持,因此你无法执行以下操作
[groups] permission_level_1 = WIKI_VIEW, TICKET_VIEW permission_level_2 = permission_level_1, WIKI_MODIFY, TICKET_MODIFY [*] @team1 = permission_level_1 @team2 = permission_level_2 @team3 = permission_level_2, TICKET_CREATE
AuthzSource策略 (mod_authz_svn
-like 权限策略)
AuthzSource策略
可用于限制对仓库的访问。粒度权限控制需要一个定义文件,该文件是 Subversion 的 mod_authz_svn
所使用的文件。有关此文件格式及其在 Subversion 中使用的更多信息,请参阅 svn 书籍“服务器配置”章节中的基于路径的授权部分。
示例
[/] * = r [/branches/calc/bug-142] harry = rw sally = r [/branches/calc/bug-142/secret] harry =
- / = 默认所有人都有读取权限
- /branches/calc/bug-142 = harry 拥有读/写权限,sally 只有读取权限
- /branches/calc/bug-142/secret = harry 没有访问权限,sally 拥有读取权限(作为子文件夹权限继承)
Trac 配置
要激活粒度权限,你必须在 trac.ini 文件的 [svn]
节中指定 authz_file
选项。如果此选项设置为 null 或未指定,则权限将不会被使用。
[svn] authz_file = /path/to/svnaccessfile
如果你想支持在 authz_file
中使用 [
模块名:/
某个/
路径]
语法,请添加
authz_module_name = modulename
其中模块名指的是 [repositories]
节中 <名称>.dir
条目所指示的相同仓库。例如,如果 [repositories]
节中的 somemodule.dir
条目是 /srv/active/svn/somemodule
,那将产生以下结果
[svn] authz_file = /path/to/svnaccessfile authz_module_name = somemodule ... [repositories] somemodule.dir = /srv/active/svn/somemodule
其中 svn 访问文件 /path/to/svnaccessfile
包含诸如 [somemodule:/some/path]
的条目。
注意:Authz 文件中的用户名必须与 Trac 中使用的用户名相同。
请确保在 trac.ini 的 permission_policies 列表中包含AuthzSource策略,否则 authz 权限文件将被忽略。
[trac] permission_policies = AuthzSourcePolicy, DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
Subversion 配置
通常,相同的访问文件会通过类似以下的 Apache 指令应用于对应的 Subversion 仓库
<Location /repos> DAV svn SVNParentPath /usr/local/svn # our access control policy AuthzSVNAccessFile /path/to/svnaccessfile </Location>
有关在多项目环境中如何限制对整个项目的访问的信息,请参阅wiki:TracMultipleProjectsSVNAccess。
默认Wiki策略 和 默认工单策略
自 1.1.2 版起,当 默认Wiki策略
在活动权限策略列表中时(在 Trac 1.1.2 到 1.3.1 版本中,DefaultWikiPolicy
曾被称为ReadonlyWikiPolicy
),wiki 页面的只读属性会被启用和强制执行。1.3.2 及更高版本中新 Trac 安装的默认设置是
[trac] permission_policies = DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
当页面设置了只读属性且用户没有 WIKI_ADMIN
权限时,无论用户是否有 WIKI_MODIFY
、WIKI_DELETE
和 WIKI_RENAME
权限,默认Wiki策略
都会返回 False
以拒绝在 wiki 页面上的修改、删除和重命名操作。在所有其他情况下,它返回 None
,这将导致咨询列表中的下一个权限策略。
自 1.3.2 版起,默认工单策略
实现了以下行为
- 已认证用户可以编辑他们自己的评论。
- 拥有
TICKET_APPEND
或TICKET_CHGPROP
权限的已认证用户可以修改他们报告的工单的描述。 - 拥有
MILESTONE_VIEW
权限的用户可以更改工单里程碑。
wiki 和工单特定的行为都在权限策略中实现,以便在需要其他行为时可以轻松替换。
从 Trac 早期版本升级时,如果在升级环境时 permission_policies
具有默认值(如果从 Trac 1.1.2 或更高版本升级,则为 ReadonlyWikiPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
),则默认Wiki策略, 默认工单策略
将被附加到 permission_policies
列表中。如果任何非默认的权限策略
处于活动状态,则需要手动将DefaultWikiPolicy, DefaultTicketPolicy
添加到列表中。在升级环境时,控制台将输出一条消息,指示是否需要采取任何操作。
默认Wiki策略 和 默认工单策略 必须在 默认权限策略 之前列出。后者在用户拥有相应的 WIKI_*
权限时,会返回 True
以允许修改、删除或重命名操作,而不考虑只读属性。类似地,如果默认权限策略
首先执行,默认工单策略
中实现的一些行为将不会被考虑。
因此,当激活时,#Authz策略应位于默认Wiki策略, 默认工单策略
之前,以便它能够授予或拒绝对单个资源的操作,这通常是Authz策略
在permission_policies
列表中的顺序。
[trac] permission_policies = AuthzPolicy, DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
#AuthzSource策略相对于默认Wiki策略, 默认工单策略
的位置无关紧要,因为它们不在相同的领域执行检查。
对于所有其他权限策略,用户需要决定正确的顺序。通常,如果权限策略应能够覆盖默认Wiki策略
或默认工单策略
执行的检查,则它应位于被覆盖策略之前。如果默认Wiki策略
或默认工单策略
应覆盖另一个权限策略执行的检查(就像这些策略相对于默认权限策略
的情况一样),则覆盖策略应首先出现。
调试权限
在 trac.ini 中设置
[logging] log_file = trac.log log_level = DEBUG log_type = file
显示 trac.log 以了解正在执行的检查
tail -n 0 -f log/trac.log | egrep '\[perm\]|\[authz_policy\]'
有关更多信息,请参阅插件的源代码文档。
另请参阅:Trac权限,用于简单编辑器的FineGrainedPageAuthzEditorPlugin。