保护烧瓶哨兵管理的正确方法

时间:2015-06-21 15:22:29

标签: python flask

flask-sentinel创建到管理UI using app.add_url_rule的路由。想要应用一些访问控制规则,我把它包装成这样:

from flask.ext import sentinel

def requires_auth(fn):
    @wraps(fn)
    def decorated(*args, **kwargs):
        roles = []
        if 'user' in session and 'roles' in session['user']:
            roles = session['user']['roles']

        if 'admin' not in roles:
            flash("Not enough power")
            return redirect('/')

        return fn(*args, **kwargs)
    return decorated

sentinel.views.management = requires_auth(sentinel.views.management)
sentinel.ResourceOwnerPasswordCredentials(app)

问题是,这是真的方式还是有更合适的方式?

修改 意识到我的问题相当抽象,而且实际上只是关于烧瓶而不是哨兵。猜猜我的意思是:“是否有更多的声明性方法将安全限制应用于Flask中的路径,而不是逐个包装每个注册路径?” 经过一番研究,这似乎提供了我正在寻找的灵活的安全控制。

from flask import Flask, request
app = Flask('bla')

PATH_ROLES = {
    '/admin/.*': ['admin']
}

@app.before_request
def before_request():
    try:
        rule = next(x for x in PATH_ROLES if re.match(x, request.path))
        print "path requires: ", PATH_ROLES[rule]
    except StopIteration: pass

1 个答案:

答案 0 :(得分:2)

快速浏览一下,我会说你的方法很合理。您基本上应用wrapping a view with a decorator的常见Flask模式。