被新公司带入坑,明明招的 pyhoner,进去后是写 ruby。
不过这段时间用过后,发现生态链很是完善的,其中有一个权限控制库 cancan 非常不错,翻了一圈发现 python 上没人写类似的,新项目准备用 Django,所以自己就写了一个,目前已经释放出来。
使用非常简单,先定义每种用户的 ability,然后进行 check ability。可实现模块权限,对象权限,自定义规则的权限,无需写入数据库,所有权限写在一起方便维护。
自己写一个装饰器,很容易整合到 Django 或者 Flask,还有很多用法详见文档。star 是 commit 的动力
1
est 2017-08-05 14:09:27 +08:00 via iPhone
cancan 还是不错的支持一下
|
2
msg7086 2017-08-06 12:00:34 +08:00
写 Python 可能没写 Ruby 那么舒服吧。毕竟 Ruby 可以自由自在地抽插对象……
|
3
cocoakekeyu OP @msg7086 我经常找不到 ruby 对象哪来的
|
4
msg7086 2017-08-06 13:08:38 +08:00
@cocoakekeyu pry 有神奇的 show-source 功能……
|
5
cocoakekeyu OP @msg7086 有机会一定试。。
|
6
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)。于是构成了一个先有鸡还是先有蛋的循环,除非我能直接构造一个逆天查询语句来做成这事…… 这么看的话,还是楼主这一种针对内容对象而不是查询的权限控制更为理想了。 |
7
recall704 2017-08-07 10:40:45 +08:00
django-guardian 不是已经有一个轮子了么?
之前我们就是用这个。 |
8
cocoakekeyu OP @fy 对,简单实用。能应付大部分场景了,欢迎一起 commit。(原库更强大)
|
9
cocoakekeyu OP @recall704 要手动分配对象权限,感觉一不小心就会忘了哪个对象有没有设置好权限,还写入数据库。有这几点不完美的地方,就一直没有使用。
|