simonw代码@痕记

导航

MoinMoin Wiki 权限使用指南

权限简介 

本文假设您已经安装好了MoinMoin Wiki并在参看本文前阅读了官方帮助文档页面, 帮助-访问权限控制表(中文翻译版本)或HelpOnAccessControlLists(英文原版).

MoinMoinWiki通过ACL(访问控制列表)提供了灵活的方式来处理页面访问权限. 你可以简单方便的为每个页面或一组页面配置个性化的权限. 在每个页面的顶部只需要类似这样的一句话即可实现权限控制.

示例#acl simonw:read,write All:read

这指明了simonw这个用户对这页有读写权限, 其他所有人有读取权限.

权限关键词为read、write、delete、revert 、admin , 前四个都很好理解, admin是指修改acl的权限, 这点很重要在配置权限时需要仔细理解, 任何显式或隐式改变页面acl属性时都需要admin权限, 例如不要在普通模板使用变量替换来达到动态改变页面acl的目的, 结果不会如你想象普通用户使用这样的模板是没权限创建页面的.  

 

权限组的概念

这里的权限组是一种集中分配权限的方式, 他能将用户分组, 并以组为单位分配权限, 这和Windows中的权限组概念一致. 一个按照特殊方式命名的页面即是一个权限组, 在配置文件中可以看到这一条

wikiconfig.pypage_group_regex = u'[a-z]Group$|组$'

这是一个来区分组页面的正则表达式, 说明了以一个小写字母加一个Group单词结尾或者以组这样的字眼结尾命名的页面均被系统认为是权限组页面. 当然这个规则你是可以自定义的, 但最好不要修改英文默认匹配方式, 也要注意其他非权限组页面不要使用这样方式的命名, 容易产生混淆. 之后将用户名以(星号两边各一个空格后面根用户名, 用户名同样可以使用链接的方式["用户名"])这样的格式添加入这个页面中就会被认为是组成员. 例如, 我建立了一个AdminGroup(或者叫"管理员组")这个权限组, 然后编辑

AdminGroup#acl simonw:read,write,admin,delete,revert  All:read
 * simonw 
 * ["simonw马甲"] 
 * simonw2马甲

第一行的acl说明了谁能编辑权限组这个页面, 你总不希望任何人都能向AdminGroup中添加用户吧, 所以这个是很重要的. 后面便说明我的n个马甲都属于AdminGroup.

组的注意事项

  • 如果你以类似这样ADMINGroup命名, 不符合正在表达式规范系统可就不会认了, 命名需要仔细.
  • wiki的页面是以文件夹形式存储的, 虽然有的操作系统对于目录是不区分大小写的如windows, 但wiki确实区分大小写的, 普通页面无所谓但管理页面, 像权限组这样的页面就需要注意了, adminGroup与AdminGroup是不同的, 你需要遵循第一创建时使用的大小写样子, 否则你在使用组来设定acl时会因为没有生效而挠头. 
  • 组是平铺的, 不支持嵌套, 所以你也不要在组里写其他组的名字.

 

配置文件中的设置

wikiconfig.py 是wiki的配置文件. 启用acl功能需要在配置文件中设置acl_enabled = 1, 配置文件中关于acl同样还有其他几个属性需要注意

  • acl_rights_before, 权限设置处, 优先级最高, 查询所有页面的acl均从这里开始. 例如, acl_rights_before  = "simonw:admin,read,write,delete,revert UserGroup:read,write,delete,revert"
  • acl_rights_default, 权限设置处, 页面如果没有acl属性设置时则默认使用这里设置的权限, 如果页面有自己的acl设置则忽略这里的设置. 在具体页面的acl属性中使用Default关键字可以继承这里的默认配置.
  • superuser, 用户设置处, 它与页面acl没有什么关系, 是指能够控制用户账户的超级用户组, 此组的用户能以任何一个注册wiki的用户身份登陆, 主要用于禁用某个wiki注册账户. 不要认为此组用户便具备了页面的admin权限.例如, superuser = [u"simonw", u"simonw马甲", ] 

 

页面权限检查流程

  1. 首先, acl_rights_before  
  2. 然后, 页面的acl属性, 如果没有则应用acl_rights_default 
  3. 最后, acl_rights_after

 关于acl属性的检查流程是自左至右, 第一匹配算法, 当匹配到相应权限时便停止. 因此你需要按照这样的逻辑形式来配置以免达不到预期效果. 单个用户名->特殊组->普通组->Known ->All.用户关键词前可以加修饰符, 加号或减号(+,-)  仅当特定的用户请求的权限匹配acl中的设定时, 处理才停止, 如果正在查找另外的权限则忽略.  

 

高级应用AutoAdmin

通常需要控制某一个页面的权限, 必须由具备admin权限的用户来修改这个页面的acl属性, 但很多情况需要让用户自己能控制某个页面及其子页面的acl访问权限.
 
例如用户自己的主页, 某个项目或团队的主页. 这些页面不仅当前页面需要交由用户控制而且这些页面的子页面也应当交与用户控制权限, 由管理员来亲自配置这些页面的权限是不现实的, 而大量赋予用户admin权限会使得整个站点的不可控制性变大.

因此需要使用一种自动机制能让用户在一个或几个页面及其子页面范围内拥有admin权限 , AutoAdmin是一种自动为页面及其子页面分配权限的机制.

在帮助页面HelpOnAutoAdmin中有这样的解决办法, 例子

个人主页模板#acl @ ME@/ReadWriteGroup:read,write @ ME@/ReadGroup:read

使用@ME@来创建模板, 用户使用这样的模板来创建页面就会获得相应的权限, 不过这有个前提, 这个用户必须有这个页面的admin权限. 而普通用户如这样创建会被告知没有权限, 因此单纯的@ME@方式失去了作用. 选择依然只有AutoAdmin. 方式很简单.

  1. 在配置文件中加入这样一行,以开启AutoAdmin模式. from MoinMoin.util.autoadmin import SecurityPolicy
  2. 有一个特殊的页面叫AutoAdminGroup, 这便是权限组的页面. 在这里把需要赋予权限的用户或组加入便能获得指定页面及其子页面的admin权限.

 应用示例, 编辑AutoAdminGroup页面

AutoAdminGroup * simonw 
 * UserGroup
 * Team/AdminGroup

第一条, 使simonw这个用户具备他自己页面及其子页面的admin权限.
第二条, 使UserGroup中所有的用户具备他自己页面及其子页面的admin权限.
第三条, 使加入到Team/AdminGroup这个权限组中的用户具备Team页面及其子页面的admin权限. 而在Team/AdminGroup中你不仅可以加入用户还能加入其他权限组. 例如编辑Team/AdminGroup这个页面

Team/AdminGroup * simonw 
 * UserGroup

这样simonw和UserGroup的所有用户具备Team页面及其子页面的admin权限.

posted on 2006-12-09 01:41  simonw  阅读(5988)  评论(1编辑  收藏  举报