Python 新的权限库 cancan

2017-08-05 13:48:09 +08:00
 cocoakekeyu

被新公司带入坑,明明招的 pyhoner,进去后是写 ruby。

不过这段时间用过后,发现生态链很是完善的,其中有一个权限控制库 cancan 非常不错,翻了一圈发现 python 上没人写类似的,新项目准备用 Django,所以自己就写了一个,目前已经释放出来。

使用非常简单,先定义每种用户的 ability,然后进行 check ability。可实现模块权限,对象权限,自定义规则的权限,无需写入数据库,所有权限写在一起方便维护。

自己写一个装饰器,很容易整合到 Django 或者 Flask,还有很多用法详见文档。star 是 commit 的动力

https://github.com/cocoakekeyu/cancan

3718 次点击
所在节点    分享创造
9 条回复
est
2017-08-05 14:09:27 +08:00
cancan 还是不错的支持一下
msg7086
2017-08-06 12:00:34 +08:00
写 Python 可能没写 Ruby 那么舒服吧。毕竟 Ruby 可以自由自在地抽插对象……
cocoakekeyu
2017-08-06 12:30:24 +08:00
@msg7086 我经常找不到 ruby 对象哪来的
msg7086
2017-08-06 13:08:38 +08:00
@cocoakekeyu pry 有神奇的 show-source 功能……
cocoakekeyu
2017-08-06 21:35:40 +08:00
@msg7086 有机会一定试。。
fy
2017-08-07 10:20:38 +08:00
这不错啊,最近受困于权限控制的问题,但我见到的权限控制都是控制接口权限,而我想要基于 SQL Table 的,头都想大了。

看了一下主要的规则实现
https://github.com/cocoakekeyu/cancan/blob/master/cancan/rule.py#L47-L77

对比来看,其实我的想法是权限控制检查加在查询上,比如说 Article 这个表限制 admin 的读取范围 0 < id < 100
这时候查询请求比如说是 id < 50,那我检测到 (0, 50) 在 (0, 100) 范围内,所以这个查询是允许的。
换到这个库就是将
def can(self, action, subject, **conditions):
改为
def can(self, action, query_of_subjects, **conditions):
大概这样子(意思如此,不考虑实现)。

然而,实现难度太高了。一个核心问题是,权限控制在查询之前执行,此时我对查询出的内容一无所知,但是要完成权限检查很多时候又需要读到内容(例如 article.user == current_user)。于是构成了一个先有鸡还是先有蛋的循环,除非我能直接构造一个逆天查询语句来做成这事……

这么看的话,还是楼主这一种针对内容对象而不是查询的权限控制更为理想了。
recall704
2017-08-07 10:40:45 +08:00
django-guardian 不是已经有一个轮子了么?
之前我们就是用这个。
cocoakekeyu
2017-08-07 11:53:07 +08:00
@fy 对,简单实用。能应付大部分场景了,欢迎一起 commit。(原库更强大)
cocoakekeyu
2017-08-07 11:56:28 +08:00
@recall704 要手动分配对象权限,感觉一不小心就会忘了哪个对象有没有设置好权限,还写入数据库。有这几点不完美的地方,就一直没有使用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/380614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX