SECURITY_UNAUTHORIZED_VIEW未重定向到登录页面

时间:2018-04-13 10:21:39

标签: python flask flask-security

我正在使用烧瓶安全性进行身份验证我想要的是当用户访问特定网址而无需登录/访问时,它会重定向到登录页面,但会重定向到主页。 我知道如果我添加

  

@login_required

decorator然后它将重定向到登录页面,但如果没有该装饰器,该怎么做。

@app.route('/result')
@roles_accepted('admin')
def result():
 //some code

我从flask文档中读到要在app配置文件中添加它。

SECURITY_UNAUTHORIZED_VIEW = '/login'

但同样不会重定向到登录页面。 任何人都可以指导我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

Flask-Security将许多其他扩展集成到一个整洁的软件包中,因此如有必要,可以独立于Flask-Security使用这些软件包。

如果您已安装Flask-Security,则还应将Flask-Login安装为依赖项。您可以使用Flask-Login中的current_user类来检查身份验证并手动重定向:

from flask import redirect
from flask_login import current_user

@app.route('/result')
@roles_accepted('/admin')
def result():
    if not current_user.is_authenticated:
        return redirect(url_for('.login'))
    else:
        some code....

我不确定这会如何与@roles_accepted一起使用,但基于source code,如果使用了不合适的角色,看起来这个装饰器会在result函数之前进行干预并使用security_unauthorized_callback处理它。

这实际上似乎与@login_required所做的类似,即在不满足指定条件时调用security_unauthorized_callback函数,在这种情况下,是适当的角色。

如果我正确理解@roles_required装饰器,则上述解决方案应该阻止任何经过身份验证的不正当角色的用户访问结果页面,然后手动重定向任何未经身份验证的用户,使其超过该检查,而不使用{ {1}}装饰者。

答案 1 :(得分:0)

发生的事情是正确的。

SECURITY_UNAUTHORIZED_VIEW = '/login'

将用户重定向到登录视图,但是,似乎正在发生的事情是您有一个未经授权的经过身份验证的用户访问该视图。当您重定向到登录页面时,由于用户已经过身份验证,因此另一个重定向发生在SECURITY_POST_LOGIN_VIEW,在您的情况下是主页。

我有两个建议。

1)如果未经授权的用户尝试访问受保护的视图,请将其注销并添加他们作为授权用户登录所需的Flash消息(假设您的SECURITY_POST_LOGOUT_VIEW为/ login)。在这种情况下,您的配置将变为

SECURITY_UNAUTHORIZED_VIEW = '/logout'

将实现您将用户重定向到登录页面的目标。即使当前用户未经过身份验证(即匿名/未登录)

,也会发生这种情况

2)不是注销用户,而是保留重定向到主页并添加一条Flash消息,要求用户以授权用户身份登录以访问资源