V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
cocoakekeyu
V2EX  ›  分享创造

Python 新的权限库 cancan

  •  
  •   cocoakekeyu · 2017-08-05 13:48:09 +08:00 · 3689 次点击
    这是一个创建于 2674 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    https://github.com/cocoakekeyu/cancan

    9 条回复    2017-08-07 11:56:28 +08:00
    est
        1
    est  
       2017-08-05 14:09:27 +08:00 via iPhone
    cancan 还是不错的支持一下
    msg7086
        2
    msg7086  
       2017-08-06 12:00:34 +08:00
    写 Python 可能没写 Ruby 那么舒服吧。毕竟 Ruby 可以自由自在地抽插对象……
    cocoakekeyu
        3
    cocoakekeyu  
    OP
       2017-08-06 12:30:24 +08:00
    @msg7086 我经常找不到 ruby 对象哪来的
    msg7086
        4
    msg7086  
       2017-08-06 13:08:38 +08:00
    @cocoakekeyu pry 有神奇的 show-source 功能……
    cocoakekeyu
        5
    cocoakekeyu  
    OP
       2017-08-06 21:35:40 +08:00
    @msg7086 有机会一定试。。
    fy
        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)。于是构成了一个先有鸡还是先有蛋的循环,除非我能直接构造一个逆天查询语句来做成这事……

    这么看的话,还是楼主这一种针对内容对象而不是查询的权限控制更为理想了。
    recall704
        7
    recall704  
       2017-08-07 10:40:45 +08:00
    django-guardian 不是已经有一个轮子了么?
    之前我们就是用这个。
    cocoakekeyu
        8
    cocoakekeyu  
    OP
       2017-08-07 11:53:07 +08:00
    @fy 对,简单实用。能应付大部分场景了,欢迎一起 commit。(原库更强大)
    cocoakekeyu
        9
    cocoakekeyu  
    OP
       2017-08-07 11:56:28 +08:00
    @recall704 要手动分配对象权限,感觉一不小心就会忘了哪个对象有没有设置好权限,还写入数据库。有这几点不完美的地方,就一直没有使用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:10 · PVG 03:10 · LAX 11:10 · JFK 14:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.