32

喜欢这个问题:让 Django 的 login_required 成为默认值的最佳方式

我现在正在使用Flask-Login's login_required装饰器。有没有让它成为默认行为Flask

4

4 回答 4

41

我在我的仪器项目中做到了这一点。我使用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
于 2012-11-19T09:48:43.983 回答
16

如果您正在使用蓝图并且需要通过登录来保护整个蓝图,您可以将整个蓝图设置before_request为需要登录。

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

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

如果您只需要检查用户是否已登录(而不是用户是否有权限),您可以简单地pass使用该功能

于 2014-09-12T08:43:15.830 回答
13

这是@MalphasWats 已经很好的答案的后续(有点pythonic,但有争议)。

还包括@nonagon 建议的重要安全修复。

漏洞解释'static' in request.endpoint

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

如果用户设置他的名字让我们说静态乔,那么:

"Static Joe" --slugifys--> /usr/profiles/static_joe.

这样就可以公开这条路线。这只是自找麻烦。


这是在每个请求处理之前附加的路由保护功能:

@app.before_request
def check_route_access():
    if any([request.endpoint.startswith('static/'),
            current_user.is_authenticated,  # From Flask-Login
            getattr(app.view_functions[request.endpoint],'is_public',False)]):
        return  # Access granted
    else:
        return redirect(url_for('users.login_page'))

Flask-Login是一个优秀的模块,让会话处理变得轻而易举

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

def public_route(decorated_function):
    decorated_function.is_public = True
    return decorated_function
于 2018-09-29T20:34:39.603 回答
1

我必须保护一个 REST API,我最终解决了这个问题:

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

(实际上我也使用了连接框架,所以我不得不使用:@app.app.before_request)

于 2020-07-13T16:06:17.777 回答