OpenStack Horizon源代码分析-用户登录全过程
首先,整个Horizon项目,主要有两部分,horizon和openstack_dashboard.
horiozn主要提供最基础的构件,如页面所需的表格、表单等基础部分;
openstack_dashboard是主要负责后端逻辑,例如登录;
整个Horizon项目的结构,如图所示:
整个Horiozn项目先从openstack_dashboard中的urls.py开始,首先进入openstack.views.splash函数。如果用户已经验证过,则直接进入主页面,否则转到登录验证模块;
如图所示:
如未登录,则需要转到Horizon项目的验证插件openstack_auth,然后从这个插件中加载urls.py;
其urls.py如图所示:
由上图可以看到,整个登录验证逻辑,主要是通过openstack_auth中的views.py中的login函数完成;登录函数如下;
如上图,点击浅蓝色部分的函数,会进入django 中的认证views.login函数,此函数如图:
在以上函数中,有一个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()函数,如图所示:
在此部分,详细的叙述了keystone验证用户名和密码的详细过程,其主要流程大概是先加载kopenstack_auth中的backend.py中的认证函数authenticate()来完成keystone的认证如图所示:
整个认证过程,主要是先加载openstack_auth中的密码认证插件,通过调用此插件完成认证。
以上内容,主要通过debug,对horiozn登录过程进行跟踪得出,如有错漏,敬请谅解。