## Please edit system and help pages ONLY in the moinmaster wiki! For more ## information, please see MoinMaster:MoinPagesEditorGroup. ##master-page:HelpOnAccessControlLists ##master-date:2005-02-24 14:50:15 #acl MoinPagesEditorGroup:read,write,delete,revert All:read #format wiki #language zh #pragma section-numbers 2 = 访问权限控制表 = 当打开'''访问权限控制表'''(简称为 ACL)时,你可以控制谁可以对维基页面做什么操作。 == 内容 == <> == 基本 == 首先,要了解 ACL 支持默认是关闭的。见 [[#Configuration|配置]] 以了解如何打开。 在 moin 中使用 ACL 简单到只需要在你要做控制的页面的顶部包括一个控制行,象下面的这一行: {{{ #acl SomeUser:read,write All:read }}} /!\ 要增加或者修改这样一个 ACL 行,你需要具有 `admin` 权限。 这将允许 `SomeUser` 读写该页,而其他用户能够读但不能编辑它 (除非你在站点配置中做了一些特殊的设置)。 当通过 moin 维基引擎访问附件时,附件也受它们所在页面的 ACL 的保护。 /!\ 当服务器配置为直接访问附件时,附件'''不受'''保护 (也就是当 wikiconfig.py 使用了 {{{attachments}}} 选项时)。 == 语法 == 每行的语法如下: {{{ #acl [+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default] }}} 其中: * '''User''' 是个用户名,仅在用户匹配时触发。 * '''Some``Group''' 是一个匹配 {{{page_group_regex}}} 的页面,其中的一些行是 “ * Member” 的形式 (见 [[#Groups|组]])。 * '''Trusted''' 是一个特殊组,包括所有的用 HTTP-Basic-authentication 进行验证的已验证用户。 * '''Known''' 是一个特殊组,包括所有有效用户 (使用 cookie 验证方法)。 * '''All''' 是一个特殊组,包括所有用户 ( Known 和匿名用户)。 * '''Default''' 是一个特殊项,它在给定的位置插入 {{{acl_rights_default}}} 中的项 (见 [[#Default|默认项]])。 * '''right''' 可以是象 read、write、delete、revert 和 admin 这样的任意单词。只有 {{{acl_rights_valid}}} 列出的单词被接受,其它的被忽略。允许不指定任何权限,这意味着没有任何权限。 == 可用的权限 == 这些是你可以用在 ACL 项中的权限。注意如果用户不是 `Known` 的话,即使授予了 `delete` 权限,也不允许 '''删除页面''' 和 '''重命名页面'''。 read:: 指定的用户能够读取该页面的内容。 write:: 指定的用户能够写(编辑)该页面的内容。 delete:: 指定的用户能够删除该页和它的附件。 revert:: 指定的用户能够将该页面还原到旧版本。 admin:: 指定的用户将具有该页面的管理权限,这表示用户能够改变 ACL 设置,包括将 “admin” 权限授予他人和剥夺他人的 “admin” 权限。 == 处理逻辑 == 当某个用户试图访问某个 ACL 保护的资源时, ACL 将按照出现的先后顺序被处理。'''第一个匹配用户的 ACL'''将判定用户是否能访问该资源,并且用户匹配一个 ACL 项后,ACL 处理停止。 (!) 由于'''第一匹配'''算法,你应该将 ACL 排序:首先是单个用户名,然后是特殊组,然后是普通组,然后是 `Known` ,最后是 `All`。 例如,下面的这个 ACL 判断 `SomeUser` 可以读写由该 ACL 保护的资源,而 `SomeGroup` 的任何成员 (如果 `SomeUser` 是该组的一部分,则不包括 `SomeUser` ) 可以管理该资源,而所有其他用户可以读取该资源。 {{{ #acl SomeUser:read,write SomeGroup:read,write,admin All:read }}} 为了让权限系统更为灵活,还提供了两个修饰符:“+” 和 “-” 前缀。当使用它们的时候,仅当特定的用户请求的权限同时匹配给定的 ACL 项的用户和权限时,处理才停止;如果正在查找另外的权限 (或者用户),处理继续。在 “+” 的情形,权限被授予;在 “-” 的情形,权限被拒绝 (并停止处理)。 举例说明,假设 `SomeUser` 是 `SomeGroup` 的一个成员,上面的那个 ACL 也可以写成: {{{ #acl -SomeUser:admin SomeGroup:read,write,admin All:read }}} 这个例子仅特殊对待 `SomeUser`,因为当查询 `SomeUser` 是否有 admin 权限时,权限将被拒绝且处理停止。任何其它情形,处理继续 (翻译者注:例如查询是否具有 read 权限)。 甚至: {{{ #acl +All:read -SomeUser:admin SomeGroup:read,write,admin }}} `+All:read` 表明当任何用户请求 read 权限时,权限被赋予且处理停止。任何其它情况下,处理继续。如果查询 `SomeUser` 的 admin 权限,将被拒绝且处理停止。任何其它情况下,处理继续。最后,如果 `SomeGroup` 的成员请求某个权限,如果指定则赋予,反之则拒绝。所有其它的用户除了配置中给予的权限外,没有任何权限。 注意,你可能不会在页面的 ACL 项中使用第二个和第三个例子那样的 ACL,但是在站点配置项中它们是很有用的。 <> == 继承默认权限 == 某些情况下,不过多影响默认权限并把权限给予某个用户是很有用的。例如,假设你在配置中有下列项: {{{ acl_rights_default = "TrustedGroup:read,write,delete,revert All:read" acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin" }}} 现在,你要在某个页面上给 `SomeUser` “write” 权限,但也要求保持 All 和 `TrustedGroup` 的默认行为。你可以轻松地用 '''Default''' 项实现: {{{ #acl SomeUser:read,write Default }}} 这个设置将把 {{{acl_rights_default}}} 中的项插入到 Default 被使用的确切地方。也就是说,上面的项,用上面给定的配置,相当于下列项: {{{ #acl SomeUser:read,write TrustedGroup:read,write,delete,revert All:read }}} 来看本章中的第一个例子: {{{acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin"}}} ACL 处理的顺序是 “before” 然后 “page/default” 然后是 “after”,“自左而右地进行”。 所以,处理开始于左边的 “before”,即 `AdminGroup:...` - 这匹配你是否是管理员组成员。 如果匹配,你获得那些权限 (arwdr),ACL 处理停止。 如果不匹配,ACL 处理继续到 `+TrustedGroup:admin` - 这匹配你是否是 `TrustedGroup` 组成员。 如果匹配,你获得权限 - 因为修饰符的关系 - ACL 处理'''仍然继续'''!所以如果有另外的项匹配该组、或者你的用户名、或者 `Known:`、或者 `All:`,你也将得到那些权限。 如果不匹配,ACL 处理继续到页面的 ACL (如果有的话) 或者默认 ACL (如果没有页面 ACL),最后是 “after” ACL。 虽然它们提供的是同样的东西,从默认权限继承有好处:能够自动获得默认设置中所做的任何后续修改。 <> == 配置 == 这些是设置一个 moin 网站的 ACL 时可以用的配置项。 ||'''项目'''||'''默认值'''||'''描述'''|| ||acl_enabled||{{{0}}}||为真将启用 ACL 支持。|| ||acl_rights_before||{{{""}}}||在页面或默认 ACL '''之前'''起作用。|| ||acl_rights_after||{{{""}}}||在页面或默认 ACL '''之后'''起作用。|| ||acl_rights_default||{{{"Trusted:read,write,delete,revert \}}}<
>{{{Known:read,write,delete,revert \}}}<
>{{{All:read,write"}}}||'''仅'''用于被访问的页面'''没有其它的''' ACL 时。|| ||acl_rights_valid||`["read", ` `"write", ` `"delete", ` `"revert", ` `"admin"]`||这些是被接收的(已知的)权限 (如果需要的话,可以在这里进行扩展)。|| 所以,你现在已经知道它'''做什么''',但'''含义'''呢? * “before” 表示 '''强制性内容''' (原因是第一匹配算法)。 * “after” 表示 '''不容忘记的内容''' (比如给所有用户读的权限)。 * “default” 表示 '''如果页面上没有 ACL 就要做的'''。它相当于把同样的 ACL 写在页面里。 <> == 组 == 用户组让给大的组指定权限变得容易。 仅 `SomeUser` 的朋友可以读写该页面: {{{ #acl SomeUser:read,write SomeUser/FriendsGroup:read,write }}} `SomeUser/FriendsGroup` 是一个页面,其中每个最高级别列表项代表一个组成员的维基用户名:{{{ #acl SomeUser:read,write,admin,delete,revert * JoeSmith * JoeDoe * JoeMiller }}} 名为 `AdminGroup` 的页面可以定义一个名为 `AdminGroup` 的组,并且可以被 ACL 保护: {{{ #acl AdminGroup:admin,read,write All:read * SomeUser * OtherUser * 目前被忽略。 其它所有不是第一级列表的文本都被忽略。 }}} /!\ 第一级列表的星号前只有一个空格 (当然在星号后也应该有一个空格)。下面的不会起作用: {{{ * some user -- 有两个空格所以不起作用 }}} 你可以配置哪些页面名称会被当作组定义页面 (例如,对于非英语维基): {{{ page_group_regex = '[a-z]Group$' # 这是默认设置 }}} == 使用场合 == === 互联网上的公开社区维基 === 最重要的原则是仅在需要的时候使用 ACL。维基依赖于信息的公开性和自由地编辑,它们使用软性的安全措施去清除“坏”内容,所以通常不需要 ACL。如果你过多使用 ACL,你可能会破坏维基的作用。 这就是为什么要么 ACL 不应该被使用 (默认情况),或者,如果使用的话,wikiconfig.py 应该看起来象这样: {{{ acl_rights_before = 'WikiEditorName:read,write,admin,delete,revert +AdminGroup:admin BadGuy:' }}} 默认的 {{{acl_rights_default}}} 选项应该满足你的要求: {{{ acl_rights_default = 'Known:read,write,delete,revert All:read,write' }}} 好的建议是 `AdminGroup` 中仅有几个且非常受信任的管理员 (他们应该非常清楚维基怎样工作,否则他们可能会最终破坏维基的工作方式:因为它的开放性,而不是因为封闭!)。 如果使用 `AdminGroup`,你应该定义一个叫做 `AdminGroup` 的页面,并且用它来定义哪些人获得管理权限。 指定象上面的 `BadGuy` 仅仅是将他排除在外 - 他不能用他的帐号读写任何内容。这只是暂时实行时有意义,否则你可以直接删除那个帐号。当然,这个 `BadGuy` 也可以匿名行事,所以这不是真正的保护 (这是软性安全措施起作用的地方)。 === 维基作为一个简单的 CMS === 如果你要用维基来方便地创建网页内容,但是你不想让它被公众编辑 (仅一些 webmaster 们编辑),你可以在 wikiconfig.py 里这样设置: {{{ acl_rights_default = 'All:read' acl_rights_before = 'WebMaster,OtherWebMaster:read,write,admin,delete,revert' }}} 这样,所有的人可以读,但只有 Webmaster 们可以做任何事情。当他们在新页面上编辑的时候,他们可以放上 {{{ #acl All: }}} ,这样没人会看到还没有完成的页面。当完成页面后,不要忘了去掉那行,这样 {{{acl_rights_default}}} 被使用。 一些页面可以允许公开的评论 (例如叫做 `PublicComments` 的页面),这样你可以在那个页面上给更多的权限: {{{ #acl All:read,write }}} === 内部网上的维基 === 如果你想在内部网上使用维基,并且你信任你的用户 (不会做恶意的事情,例如把其它人排除或者劫持页面) 能够明智地使用管理功能,你可以这样用: {{{ acl_rights_default = 'Known:admin,read,write,delete,revert All:read,write' acl_rights_before = 'WikiAdmin,BigBoss:read,write,admin,delete,revert' }}} 这样,所有人都可以读、写和改变 ACL,`WikiAdmin` 和 `BigBoss` 可以做任何事情,已知用户通过 {{{acl_rights_default}}} 获得管理权限 (所以只要页面上没有其它 ACL 他们就可以获得) 后果: * 在新建页面上,创建者可以放上任何 ACL * 在已存在的页面上,如果没有 ACL,任何已知用户能够设置任何 ACL * 在没有 ACL 的页面上,所有人 (除 `WikiAdmin` 和 `BigBoss`) 都能被 (已知的) 任何其他人排除 === 维基作为公司页面 === 如果你要用维基作为公司主页,不希望所有用户都能更改公司页面内容,你可以使用: {{{ acl_rights_default = "TrustedGroup:admin,read,write,delete,revert All:read" acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin" }}} 这表示: * 默认情况下,已知用户和匿名用户仅被允许读页面 * 在新建的页面上,如果没有 ACL,任何 `TrustedGroup` 的用户都可以设置任意的 ACL * 除了 `AdminGroup` 外,所有人都可以被其他管理员或受信任用户排除 * `TrustedGroup` 成员可以在任何他们可以写的页面上使用管理权限,即使有特定的 ACL === 在只读页面上进行评论 === 通过使用可写的子页面,你可以很方便地给只读页面添加评论部分,并允许用户在上面写内容。例如,你可以这样定义 `SomePage` 页面: {{{ #acl SomeUser:read,write All:read '''一些只读内容 ''' ... ''' 用户评论 ''' [[Include(SomePage/Comments)]] }}} 象这样添加 `SomePage/Comments` 页面: {{{ #acl All:read,write 在这里添加你对 SomePage 的评论。 }}} 此页的英文版本:HelpOnAccessControlLists