Horizon的登录过程

Horizon的登录过程

正常的Django访问流程

1
2
3
4
5
6
7
8
9
10
flow
st=>start: Requests
manager=>operation: python manage.py runserver
setting=>inputoutput: setting.py
user=>operation: User
url=>operation: url.py
views=>operation: views.py
e=>end: Terminate
st->manager(right)->setting->url->views->user->e

Django身份认证框架

1
2
3
4
5
6
7
8
9
10
11
12
st=>start: Request
auth=>condition: authentication
& authorization
response_302=>operation: Response 302
response_redirect=>operation: Redirect to Login
user_view=>operation: Response of User Views
login=>operation: Login
record=>operation: Record SessionID to Cookies
e=>end: response
st->auth
auth(no)->response_302->response_redirect->login->record(right)->auth
auth(yes)->user_view->e

Django的身份验证系统

  1. auth模块是Django提供的标准权限管理系统,并可拓展性

  2. auth身份验证系统包括:

    • user

    user对象是身份验证系统的核心(django.contrib.auth.models.User类)

    • permission

    为指定的用户和用户组指定权限(django.contrib.auth.models.ModelAdmin类)

    • group

    一个分组中的用户可自动获得该分组的权限(django.contrib.auth.models.Group类)

    • 可配置的密码哈希系统

    django不在用户模型中存储原始密码,只存储密码的哈希值

  3. 可集成第三方认证系统

django.contrib.auth

  1. settings.py文件中的INSTALLED_APPS

    添加django.contrib.auth以激活认证系统

  2. settings.py文件中的MIDDLEWARE_CLASSES

    添加django.contrib.auth.middleware.AuthenticationMiddleware以在中间件处理request请求时完成身份认证

  3. settings.py文件中的AUTHENTICATION_BACKENDS

    添加openstack_auth.backend.KeystoneBackend以指定keystone进行用户认证

自定义认证后端

1
自定义认证后端:通过类定义,且必须实现以下两个方法
  1. authenticate()

    authenticate()检查传入的用户凭据,并在通过检查时返回对应的User对象,否则返回None当调用authenticate()
    方法时,Django会在AUTHENTICATION_BACKENDS指定的所有身份认证后端中一一尝试认 证(第一个后端认证失败,尝试使用第二个认证后端,
    依次类推)

  2. get_user(user_id)

    参数user_id可以是用户名或数据库中的ID等,但必须是User对象的主键get_user()返回一个User对象

使用django身份验证系统

  1. Django使用会话和中间件把身份验证系统插入request对象,为每个请求提供request.user 属性,表示当前用户
  2. 未认证用户是一个AnonymousUser实例,已认证用户是一个User实例
  3. request.user提供了一个方法is_authenticated()判断当前用户是否登陆

Horizon登录验证流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
st=>start: 开始
user=>operation: 用户
url=>operation: url.py
is_user_exist=>condition: 用户存在?
get_user_home=>operation: horizon.__init__.get_user_home
has_dashboard=>condition: 有默认Dashboard
base_get_user_home=>operation: horizon.base.Size:get_user_home(self,user)
views_get_user_home=>operation: openstack_dashboard.views.py:get_user_home(user)
get_default_dashboard=>operation: horizon.base.Size: get_default_dashboard()
registered=>operation: horizon.base.Registry._registered()
get_absolute_url=>operation: horizon.base.Dashboard.get_absolute_url()
panel_get_absolute_url=>operation: horzion.base.Panel.get_absolute_url()

auth_form_login=>operation: openstack_auth.forms.login()
t_or_v=>condition: Template?
template_html=>operation: horizon/templates/login.html
auth_form_login_init=>operation: openstack_auth.forms.login.__init__()
get_region=>operation: openstack_auth.forms.lgin.get_region_choise()
response=>operation: Response
base_html=>inputoutput: horizon/templates/base.html
login_html=>inputoutput: horizon/template/auth/_login.html
e=>end: 结束

st->user->url->is_user_exist
is_user_exist(yes)->get_user_home->has_dashboard
is_user_exist(no)->auth_form_login->t_or_v
t_or_v(yes)->base_html->login_html->template_html->response
t_or_v(no)->auth_form_login_init->get_region->response->e
has_dashboard(yes)->get_default_dashboard
has_dashboard(no)->base_get_user_home->views_get_user_home(left)->get_default_dashboard->registered->get_absolute_url->panel_get_absolute_url->response
get_user_home(yes)->base_get_user_home

作者

Cyrusky

发布于

2018-07-02

更新于

2024-11-18

许可协议

评论