喜欢这个问题:Best way to make Django's login_required the default
我现在正在使用Flask-Login
的{{3}}装饰器。无论如何,它是Flask
中的默认行为吗?
答案 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)