使Flask-Login的login_required成为默认值的最佳方法

时间:2012-11-17 07:38:15

标签: python flask

喜欢这个问题:Best way to make Django's login_required the default

我现在正在使用Flask-Login的{​​{3}}装饰器。无论如何,它是Flask中的默认行为吗?

4 个答案:

答案 0 :(得分:34)

我在instruments项目中这样做了。我使用before_request装饰器:

@app.before_request
def check_valid_login():
    login_valid = 'user' in session # or whatever you use to check valid login

    if (request.endpoint and 
        'static' not in request.endpoint and 
        not login_valid and 
        not getattr(app.view_functions[request.endpoint], 'is_public', False) ) :
        return render_template('login.html', next=request.endpoint)

然后我为少数几个无需登录即可访问的地方创建了一个is_public()装饰器:

def public_endpoint(function):
    function.is_public = True
    return function

答案 1 :(得分:8)

如果您使用蓝图并需要使用登录保护整个蓝图,则可以使整个before_request需要登录。

这是我用于CMS蓝图的内容:

@cms.before_request
@login_required
def before_request():
    if g.user.role != ROLE_ADMIN:
        abort(401)

如果您只需要检查用户是否已登录(而不是用户具有权限),您只需pass该功能

答案 2 :(得分:3)

这是对@MalphasWats的跟进(更多pythonic但多数民众赞成在中) 已经很好的答案。

还包括由@nonagon建议的重要安全修复程序

使用@app.before_request def check_route_access(): if any([request.endpoint.startswith('static/'), current_user.is_authenticated, # This is from Flask-Login getattr(app.view_functions[request.endpoint],'is_public',False)]): return # Access granted else: return redirect(url_for('users.login_page')) 对漏洞的解释:

想象一下,可以通过某种方式来定义用户的路线,例如个人资料链接。

如果用户设置了他的名字,请说“静态乔”,然后:

def public_route(decorated_function): decorated_function.is_public = True return decorated_function

通过这种方式可以公开此路线。这只是自找麻烦。


以下是路由防护功能,该功能在每次请求处理之前被应用:

$pattern = "/(\w+\s\w+)\s-\s([0-9]{2}\s\w+\s[0-9]{4})\s([0-9]+:[0-9]+)/";
$chain = "Dipak Misra - 18 Nov 2018 10:20";
preg_match_all($pattern, $chain, $matches);

$data = [
    'chain' => $chain,
    'pattern' => $pattern,
    'name' => $matches[1],
    'date' => $matches[2],
    'time' => $matches[3]
];

echo "<pre>";
print_r($data);
echo "<pre>";

Flask-Login是一个出色的模块,使会话处理变得轻而易举

这是装饰器(@public_route),您可以使用它来允许访问默认情况下需要公共访问的特殊页面。 (注册页面,登录页面):

{{1}}

答案 3 :(得分:1)

我必须保护REST API,并且终于解决了这个问题:

@app.before_request
@auth.login_required
def login_required_for_all_request():    
    pass  

(实际上,我也使用了connexion框架,因此我必须使用:@ app.app.before_request)