本文假设您已经安装好了MoinMoin Wiki并在参看本文前阅读了官方帮助文档页面, 帮助-访问权限控制表(中文翻译版本)或HelpOnAccessControlLists(英文原版).
MoinMoinWiki通过ACL(访问控制列表)提供了灵活的方式来处理页面访问权限. 你可以简单方便的为每个页面或一组页面配置个性化的权限. 在每个页面的顶部只需要类似这样的一句话即可实现权限控制.
这指明了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马甲", ]
页面权限检查流程
首先, acl_rights_before
然后, 页面的acl属性, 如果没有则应用acl_rights_default
最后, acl_rights_after
关于acl属性的检查流程是自左至右, 第一匹配算法, 当匹配到相应权限时便停止. 因此你需要按照这样的逻辑形式来配置以免达不到预期效果. 单个用户名->特殊组->普通组->Known ->All.用户关键词前可以加修饰符, 加号或减号(+,-) 仅当特定的用户请求的权限匹配acl中的设定时, 处理才停止, 如果正在查找另外的权限则忽略.