MoinMoin Wiki权限设置

本来没怎么弄Wiki的(尽管我天天都在用wikipedia),而前两天去我们Team Wiki上更新一个页面,居然提示我的用户没权限编辑此页面,其他人问了下,他们也不知道,而我们组以前对此wiki做维护的人年初也离职了,所以只得自己去慢慢倒腾找原因。首先找到一个同事得到wiki所在的服务器的root权限,然后根据目录判断,这个wiki是一个叫做MoinMoin的东东,以前没见过。根据各种google结果,后来终于找到了答案。
MoinMoin Wiki的权限管理设置:
在wiki主目录下有一个wikiconfig.py的文件,搜索acl可以找到acl的配置。看到每一个有编辑权限的人,都加了Tom:read,write的字样,自然我就在加上了Yongjie:read,write,这样也算解决问题了。后来,老板说,其实这些权限限制不需要了,好吧,我就直接把为每个人分配权限的文字删掉,简单用个All:read,write就搞定了。内部系统嘛,可以正常工作就是了。
另外,MoinMoin是什么呢? wikipedia上说如下。
MoinMoin is a wiki engine implemented in Python, initially based on the PikiPiki wiki engine. The MoinMoin code is licensed under the GNU General Public License v2, or (at the user's option) any later version (except some 3rd party modules that are licensed under other Free Software licenses compatible with the GPL). A number of organizations use MoinMoin to run public wikis, including notable free software projects Ubuntu, Apache, Debian, FreeBSD, and others.

MoinMoin Wiki的更多权限管理的设置,这里简单摘录,详情见如下网页:
http://www.cnblogs.com/simonw/archive/2006/12/09/586923.html
http://moinmo.in/Documentation
MoinMoinWiki通过ACL(访问控制列表)提供了灵活的方式来处理页面访问权限. 你可以简单方便的为每个页面或一组页面配置个性化的权限. 在每个页面的顶部只需要类似这样的一句话即可实现权限控制.

示例

#acl simonw:read,write All:read

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

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

 

权限组的概念

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

wikiconfig.py

page_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

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*