2015-06-21 3 views
3

колба-прицел создает маршрут управления 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) 

Вопрос заключается в том, действительно ли это так, или есть более подходящий способ?

EDIT: Понял, что мой вопрос был довольно абстрактным и на самом деле просто о колбе вместо часового. Угадайте, о чем я хотел спросить: «Есть ли еще более декларативный способ применения ограничений безопасности к путям в 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 

ответ

2

С быстрым взглядом я бы сказал, что ваш подход звучит. Вы, по существу, применяете общий шаблон колбы от wrapping a view with a decorator.

+0

Да, это просто показалось хакерским, применяя декоратор программным способом, а не как объявление к виду. Попытка использовать некоторые другие подходы, спасибо за обзор, хотя. :) – stt

Смежные вопросы