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