Flask_Login使用与源码解读

一、前言

用户登录后,验证状态需要记录在会话中,这样浏览不同页面时才能记住这个状态,Flask_Login是Flask的扩展,专门用于管理用户身份验证系统中的验证状态。

注:Flask是一个微框架,仅提供包含基本服务的核心(路由、网关接口、模板),其它功能都是通过扩展来实现,它有无数扩展,你可以根据需要自由组合,这一系列文章我们会来介绍一下这些扩展的使用以及解读一下其源码,另外关于分布系统登录方案可以参考 《Session、Token、Jwt三种登录方案介绍》。

二、登录认证主要代码

pip install flask-login

1、模型中定义User对象

Flask_Login使用与源码解读_第1张图片

注:User对象继承UserMixin

注:配置user_loader,用于被回调。

2、初始化flask-login

初始化Login_manager对象,并且设置登录页面地址,这样当匿名用户访问时会重定向到登录页。

3、登录

Flask_Login使用与源码解读_第2张图片

注:调用login_manager 的login_user方法进行登录。

4、接口拦截

Flask_Login使用与源码解读_第3张图片

注:相当于一个拦截器,当匿名用户调用配置了装饰器的该接口后会被重定向到登录页。

三、flask-login源码分析

1、UserMixin

Flask_Login使用与源码解读_第4张图片

注:User模型继承自UserMixin,它提供了缺省配置实现,可以满足大多数场景的需求。

2、登录

关键代码调用flask_login中的login_manager.login_user(user,form.remember_me.data)

Flask_Login使用与源码解读_第5张图片

注:构建session对象,包括sessionid以及user_id(用户表主键),其中sessionid是调用utils.py _create_identifier生成。

Flask_Login使用与源码解读_第6张图片

注:这样生成的sessionid只要user-agent和IP相同就是一样的????

remember保持登录状态,每次重新登录会往后延。

current_app.login_manager._update_request_context_with_user(user)

注:将User对象存储到当前的request_context中。

user_logged_in.send(current_app._get_current_object(), user=_get_user())

user_logged_in是flask_login定义的Signals,这里将user对象为信号传递给相应的回调函数。

3、拦截

@require_login  装饰器

Flask_Login使用与源码解读_第7张图片

注:如果当前用户 is_authenticated为True则正常处理请求,否则进入login_manager.

unauthorized()的处理流程(重定向到登录页,登录后跳回本地址)

current_user的定义

注:current_user通过_get_user()来获取用户,一般会返回要么是正常用户(签权成功),要么是匿名用户(签权失败)。

注:如果用户登录后,会将user存储在当前request_context中,我们就可以直接获取,如果request_context中没有user对象,将调用_load_user()来恢复(服务器重启就会走这个路径,浏览器并不需要重新登录)

Flask_Login使用与源码解读_第8张图片

如果session中还有user_id,通过id调用 user_loade装饰器加载用户,如果没有id则通过remeber cookie、request、request header依次尝试去加载用户。

注:源码中关于回调那块用了Python的Signals机制(信号机制)这个下次再学习。

你可能感兴趣的:(Python&Go,flask,python,后端)