OpenStack Horizon源代码分析-用户登录全过程

首先,整个Horizon项目,主要有两部分,horizon和openstack_dashboard.

        horiozn主要提供最基础的构件,如页面所需的表格、表单等基础部分;

        openstack_dashboard是主要负责后端逻辑,例如登录;

整个Horizon项目的结构,如图所示:

OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

整个Horiozn项目先从openstack_dashboard中的urls.py开始,首先进入openstack.views.splash函数。如果用户已经验证过,则直接进入主页面,否则转到登录验证模块;

如图所示:

OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

如未登录,则需要转到Horizon项目的验证插件openstack_auth,然后从这个插件中加载urls.py;

其urls.py如图所示:

OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

由上图可以看到,整个登录验证逻辑,主要是通过openstack_auth中的views.py中的login函数完成;登录函数如下;

OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

如上图,点击浅蓝色部分的函数,会进入django 中的认证views.login函数,此函数如图:

OpenStack Horizon源代码分析-用户登录全过程

在以上函数中,有一个form.isValid()判断函数,主要通过keystone验证用户是否有效,详情请见djiango中关于form的认证原理的讲述;

openstack_auth中form.py继承django_auth_forms.AuthticationForm类,也就意味着openstack_auth的form.py会与django中的form类中的验证函数相结合,其中django_auth_forms.AuthticationForm类有一个钩子函数clean()函数,它将抛出所有的验证异常,而此钩子函数的具体实现则在子类openstack_auth中form.py中。


其中,form.py详细的说明了如何进行登录验证,如何加载openstack_auth中的密码插件进行验证,其中,最重要的部分是clean()函数,如图所示:

OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

在此部分,详细的叙述了keystone验证用户名和密码的详细过程,其主要流程大概是先加载kopenstack_auth中的backend.py中的认证函数authenticate()来完成keystone的认证如图所示:OpenStack Horizon源代码分析-用户登录全过程

OpenStack Horizon源代码分析-用户登录全过程

整个认证过程,主要是先加载openstack_auth中的密码认证插件,通过调用此插件完成认证。


以上内容,主要通过debug,对horiozn登录过程进行跟踪得出,如有错漏,敬请谅解。