这不错啊,最近受困于权限控制的问题,但我见到的权限控制都是控制接口权限,而我想要基于 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)。于是构成了一个先有鸡还是先有蛋的循环,除非我能直接构造一个逆天查询语句来做成这事……
这么看的话,还是楼主这一种针对内容对象而不是查询的权限控制更为理想了。