VirtualBox

细粒度权限

Trac 具备一套通用机制,允许自定义权限策略以授予或拒绝对任何 Trac 资源,甚至特定版本资源的任何操作。

该机制是 Authz策略,它是 tracopt.perm.authz_policy.* 中的一个可选组件,默认不激活。它可以通过 Trac 管理模块中的插件面板激活。

有关 Trac 权限和权限策略的更一般性介绍,请参阅Trac权限

权限策略

可以实现各种各样的权限策略,Trac 也提供了一些示例。

活动的策略由一个配置设置决定

[trac]
permission_policies = DefaultWikiPolicy,
 DefaultTicketPolicy,
 DefaultPermissionPolicy,
 LegacyAttachmentPolicy
  • 默认Wiki策略控制对 wiki 页面的只读访问。
  • 默认工单策略为已认证的用户在工单系统中提供更高的权限。
  • 默认权限策略检查Trac权限中描述的传统粗粒度权限。
  • 旧附件策略使用粗粒度权限检查附件的权限。

在可选策略中,有#Authz策略,这是一种基于 Authz 风格系统的非常通用的权限策略。有关详细信息,请参阅authz_policy.py

另一个权限策略#AuthzSource策略,使用 Subversion 定义的基于路径的授权来强制执行版本控制系统的权限。

另请参阅sample-plugins/permissions 获取更多示例。

Authz策略

配置

  • 在服务器上一个安全的位置放置一个空的配置文件(authzpolicy.conf),该文件除 web 用户外,其他用户不可读。如果文件包含非 ASCII 字符,应使用 UTF-8 编码。
  • 更新你的 trac.ini 文件
    1. 修改 [trac] 节中的permission_policies选项
      [trac]
      permission_policies = AuthzPolicy, DefaultWikiPolicy, DefaultTicketPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy
      
    2. 添加一个新的 [authz_policy] 节,并将 authz_file 选项指向该配置文件
      [authz_policy]
      authz_file = /some/trac/env/conf/authzpolicy.conf
      
    3. 通过Web管理界面或编辑 [components] 节来启用插件
      [components]
      tracopt.perm.authz_policy.* = enabled
      

使用说明

请注意权限策略的指定顺序:策略按照提供的顺序执行,因此可能会覆盖先前的策略规范。

对于给定的权限检查,策略将返回 TrueFalseNone。如果策略明确授予权限,则返回 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_MODIFYWIKI_DELETEWIKI_RENAME 权限,默认Wiki策略都会返回 False 以拒绝在 wiki 页面上的修改、删除和重命名操作。在所有其他情况下,它返回 None,这将导致咨询列表中的下一个权限策略。

自 1.3.2 版起,默认工单策略实现了以下行为

  • 已认证用户可以编辑他们自己的评论。
  • 拥有 TICKET_APPENDTICKET_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

上次修改 2 年前 上次修改于 2023年6月2日 上午10:32:55
注意: 查看 TracWiki 获取使用维基的帮助。

© 2025 Oracle 支持 隐私 / 请勿出售我的信息 使用条款 商标政策 自动化访问礼仪