喜欢这个问题:让 Django 的 login_required 成为默认值的最佳方式
我现在正在使用Flask-Login
's login_required装饰器。有没有让它成为默认行为Flask
?
喜欢这个问题:让 Django 的 login_required 成为默认值的最佳方式
我现在正在使用Flask-Login
's login_required装饰器。有没有让它成为默认行为Flask
?
我在我的仪器项目中做到了这一点。我使用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
如果您正在使用蓝图并且需要通过登录来保护整个蓝图,您可以将整个蓝图设置before_request
为需要登录。
这是我用于 CMS 蓝图的内容:
@cms.before_request
@login_required
def before_request():
if g.user.role != ROLE_ADMIN:
abort(401)
如果您只需要检查用户是否已登录(而不是用户是否有权限),您可以简单地pass
使用该功能
这是@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
我必须保护一个 REST API,我最终解决了这个问题:
@app.before_request
@auth.login_required
def login_required_for_all_request():
pass
(实际上我也使用了连接框架,所以我不得不使用:@app.app.before_request)