flask-login模块

Posted tsxh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask-login模块相关的知识,希望对你有一定的参考价值。

flask-login为flask提供了用户会话管理。他处理了日常的登入,登出并且长时间记住用户的会话。

1.在会话中存储当前活跃的用户ID,让你能够自由地登入和登出。

2.让你限制登入或登出用户可以访问的视图。

3.处理让人棘手的记住我功能。

4.帮助你保护用户会话免遭cookie被盗的牵连。

5.可以与以后可能使用的flask-principal或其他认证扩展集成。

 

一、配置你的应用

对一个使用flask-login的应用最重要的一部分是loginmanager类。

login_manager = LoginManager()
login_manager.init_app(app)

二、他是如何工作的

必须提供一个user_loader回调。

@login_manager.user_loader
def load_user(userid):
    return User.get(userid)

接受一个用户的unicodeID作为参数,并且返回响应的用户对象。

如果ID无效的话,他应该返回none。

三、你的用户类

你用来标识用户的类需要实现这些属性和方法:

四个方法:

is_authenticated、is_active、is_anonymous、get_id

is_authenticated 当用户通过验证时,也即提供有效证明是返回true。

is_active 可以直接返回true。

is_anonymous 如果是匿名用户,返回true。真实用户返回False。

get_id 返回一个能唯一识别用户的,并能用于user_loader回调中加载用户的Unicode ID。

 

要简便的实现用户类,可以从UserMixin继承,他提供了对所有这些方法的默认实现。

 

四、login示例

一旦用户通过验证,使用login_user函数让用户登录。

@app.route(/login,methods=[GET,POST])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        login_user(user)
        flask.flash(Logged in successfully.)

        next = flask.request.args.get(next)
        if not next_is_valid(next):
            return flask.abort(400)
        return flask.redirct(next or flask.url_for(index))
    return flask.render_template(login.html, form=form)

这里必须验证next参数,如果不验证,你的应用会收到重定向攻击。

 

需要用户登入的视图可以用login_required装饰器来装饰。

@app.route(/settings)
@login_required
def settings():
    pass

 

当用户需要登出时,使用logout_user方法。

@app.route(/logout)
@login_required
def logout():
    logout_user()
    return redirect(somewhere)

他们会被登出,且他们会话产生的任何cookie都会被清理干净。

 

五、定制登入过程

默认情况下,当未登录的用户尝试访问一个login_required装饰的视图,flask-login会闪现

一条消息并且重定向到登录视图。

如果未设置登录视图,他将会以401错误退出。

登录视图的名称可以设置成LoginManager.login_view。

login_manager.login_view = users.login

 

默认的闪现消息是Please log in to access this page.

要自定义该信息,请设置login_message。

login_manager.login_message = uplease log in

 

要自定义消息分类,请设置login_message_category。

login_manager.login_message_category = info

 

当重定向到登入视图,他的请求字符串中会有一个next变量,其值为用户之前访问的页面。

 

六、使用request loader定制登录

有时你想要不使用cookies情况下登录用户,比如使用http头或者一个作为查询参数的api密钥。

这种情况下应该是用request_loader回调。

 

七、匿名用户

默认情况下,当一个用户没有真正的登录,current_user被设置成一个AnonymousUserMixin对象。

is_active is_authenticated的值为False

is_anonymous的值为true

get_id返回None

 

八、记住我

记住我的功能很难实现。但是flask-login几乎透明的实现它。

只要把remember=True传递给login_user。

一个cookie将会存储在用户计算机中,如果用户会话中没有用户ID的话,flask-login会自动地从cookie中恢复用户ID。

这里cookie是防篡改的。

该层功能是被自动实现的。

 

九、会话保护

当上述特性保护记住我令牌免遭cookie窃取时,会话cookie依然是脆弱的。

session_protection的值为basic或者strong。禁用时应设置为None。

默认时被激活为basic模式。

 

这里需要知道字符串或者数字如何转换为Unicode。非常重要。

计划在下一篇博客中讨论。

 

以上是关于flask-login模块的主要内容,如果未能解决你的问题,请参考以下文章

flask-login模块

Flask-HttpAuth 和 Flask-Login

flask之flask-login登陆验证

Flask-Login 使用和进阶

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑——使用Flask-Login库实现登录功能

一个使用Flask-Login登录后的Pytest测试用例的坑