前几天在邮件列表看到大家在说有没有好用的权限管理工具,有人说 Zend_Acl 不错。我看了下官网文档,貌似是挺不错的,用起来很方便。可惜 Zend_Acl 是 PHP 的,我于是兴起模仿它的用法,写了一个 Python 版的。
想不到好名字,就叫 Simple-RBAC 了。目前只实现了 Access Control List 部分(当然这也是核心部分),等赶完这批作业再实现 Flask 插件神马的。Flask 插件里面有一个类似的,叫 Flask-Principal,这个更简洁更好用,但是不支持角色继承、资源继承什么的。Simple-RBAC 实现了角色和资源的继承,而且可以通过一个 assertion 附加条件,给规则生效指定上下文(比如早上九点到十点规则才生效)。设计思路方面,和 Zend_Acl 基本一致。
和 Zend_Acl 不一样的一点是关于类型的设计,Zend_Acl 使用的是我感到很恶心的接口契约,用 PHP 语言中的 interface 定义 Role、Resource 等。我不是讨厌接口,如果在 Java 中这么写我会觉得很正常,但是在 PHP 这样的动态语言中还去用接口约束类型,我觉得很多此一举。所以在 Simple-RBAC 中我采取了“会游泳的都是鸭子”策略——没有约束 Role、Resource 的类型签名。
我写的 使用范例 中 Role 和 Resource 都是直接使用字符串的。实际上如果有需要,我们也可以定义自己的 Role 和 Resource 类型,比如一个 SQLAlchemy 映射过的 Model 类 —— 只要它在 set 容器里是安全的,也就是实现了 __eq__ 和 __hash__ 方法(所谓的 hashable)。等晚点我也会往里面加一个 contrib 包,用来包含 SQLAlchemy Model、Django Model 的 Role 和 Resource 类定义,这样用起来就更省事。不过就我个人看法,我更建议使用字符串,因为字符串更简单、通用,无论开发者使用的是数据库中保存的角色表还是配置文件中定义的静态角色,获取一个能唯一标识角色、资源的字符串总是可以的 —— 角色和资源总有名字吧。
目前项目托管在 Github ,用 MIT 许可协议开放源代码。可以克隆到本地安装,或者直接用 pip 从 git 仓库安装。单元测试也已经写好,用 setup.py test 可以运行。
其实最希望的就是有兴趣的同学可以试用一下(我也会在我的下个项目中试用),如果有意见或者建议可以通过 各种 方式联系我,或者向 github 托管的仓库发送 issues,又或者是 fork 下来然后推 pull request。好吧,我承认 github 的这些功能我大部分都没用过,想试一下。
具体的使用方法,可以看 项目主页 或者单元测试,我没写详细的文档,因为觉得本来就是个挺简单的东西。