Session

session 的数据存在数据库中,它在客户端是用 cookie 来识别的,作为一个票据。这个 cookie 的名称,默认就叫 "sessionid",但是可以通过 settings.SESSION_COOKIE_NAME 来修改。

sessionid 这个 cookie 的值,在服务器端就是 session 的 session_key 属性,同时数据库的 django_session 表中用它作为主键。

session 的实现涉及下列几个主要的类:

1. Session 和 SessionManager.

这两个是 session 的 Model 及其相应的 Manager. 它们负责:

(1) session 和数据库之间的持久化操作
    (2) session_key 的生成机制
    (3) session 内容(是一个字典)的序列化/反序列化工作。

实际应用中,我们不会直接用到这两个类。

2. SessionWrapper

实现了 session 类似字典的一些功能,如设值、取值等。这个类是 request.session 对象的实际类型。

3. SessionMiddleware

属于 django 自带的中间件之一,作用是在 request 中附加 session 属性,并可以在 response 的时候,适当的情况下保存 session 并发出相应的 cookie 到客户端。

session 的几个可配置的参数:

settings.SESSION_SAVE_EVERY_REQUEST
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
settings.SESSION_COOKIE_AGE
settings.SESSION_COOKIE_SECURE
settings.SESSION_COOKIE_DOMAIN
settings.SESSION_COOKIE_NAME

User

request.user 中保存的 user 对象,是 lazy-load 的,有缓存。

用户的身份验证过程:

1. 首先通过 authenticate() 方法对传入的用户名、密码等信息进行验证,如果符合,则返回相应的 user 对象,同时,该方法会对 user 对象加以标注,通过附加 user.backend 属性来记录验证是被哪个配置的 backend 通过的。默认只有一个 backend,是 django.contrib.auth.backends.ModelBackend.

2. login 方法调用
    如果上一步身份验证通过,则此方法中对 request.session 中简单的添加两个键值:
    (1) "_auth_user_id"  这个是 user.id
    (2) "_auth_user_backend" 这个是 user.backend

而实现 request.user 属性同样是通过 Middleware 来完成的,其中调用到一个 get_user 方法,该方法尝试读取上面在 session 中记录的 user.id 和 user.backend, 然后命令 backend 去查找相关 id 的 user 对象。如果没有找到,则返回一个 AnonymousUser. 而 AnonymousUser 是一个空实现,不具备 user 的任何功能。

可以通过 is_anonymous() 或 is_authenticated() 来判别是否为匿名用户。

小结

django 中 user 和 session 关系不大,仅仅是在其实现中利用 session 保存了 user.id 和 user.backend 两个值。

转载于:https://www.cnblogs.com/RChen/archive/2007/07/12/django_session_and_user.html

django 中的用户身份验证和 session 的关系相关推荐

  1. 如何在Python Django中处理用户身份验证

    by Mohammed Subhan Khan 由Mohammed Subhan Khan 如何在Python Django中处理用户身份验证 (How to handle user authenti ...

  2. Django官方文档翻译——Django中的用户身份验证(User authentication in Django)

    原文地址:https://docs.djangoproject.com/en/3.0/topics/auth/ Django中的用户权限验证 Django本身自带了一个权限验证系统,它可以用来处理用户 ...

  3. twitter4j android,使用twitter4j api登录twitter而无需在android中打开用户身份验证页面...

    我使用twitter4j api登录twiter并发布推文. 我还在https://dev.twitter.com/apps/new上注册了该应用,并获得了消费者密钥和秘密. Configuratio ...

  4. HTTP 中的用户身份验证

      身份验证是判断客户端是否有资格访问资源的过程.HTTP 协议支持将身份验证作为协商访问安全资源的一种方式.   来自客户端的初始请求通常是匿名请求,不包含任何身份验证信息. HTTP 服务器应用程 ...

  5. php中用户验证的方式,在php中进行用户身份验证的最佳方式是什么?

    使用 Sessions.将会话ID存储在cookie中,并将用户的状态存储在服务器端(loggedIn,userId,IP). 澄清您需要存储在会话数组中: > loggedIn:一个关于用户是 ...

  6. php路由器怎么登录认证,PHP用户身份验证,如路由器登录

    当我们尝试登录路由器时,如何在php中创建用户身份验证. 当我输入网址,例如www.example.com/portal时,应该有一个提示,如上面的图像询问用户名和密码. 这是什么类型的身份验证.如何 ...

  7. forms身份验证 不跳转_Django用户身份验证实战

    在这篇Django文章中,我们 将讨论Django User 验证,Django附带了一个用户认证系统.它处理用户帐户,组,权限和基于cookie的用户会话.Django身份验证系统同时处理身份验证和 ...

  8. asp.net中的窗体身份验证(最简单篇)

    在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份验证的方式各有不同.一般来说,网站的身份验证方式都会经过以下几 ...

  9. django官方文档——django中的用户认证

    Django 中的用户认证¶ Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的会话.本文说明这个系统是如何工作的. 概览¶ 认证系统由以下部分组成: 用户 权 ...

最新文章

  1. 【Code Complete】《Code Complete 》
  2. 打开了Visual Studio,又关了
  3. mysql中union all的order by问题
  4. Computer:计算机测试理论(开发/测试/上线)之DEV、SIT、UAT、PRD四套环境详细介绍之详细攻略
  5. php中如何固定表格宽度,实例讲解DataTables固定表格宽度(设置横向滚动条)
  6. 用python爬取知识星球
  7. php html页面获取session,怎么在html中获取session变量
  8. Java Web学习总结(14)——JSP基础语法
  9. conda环境内安装gcc4.8.5(无root权限)
  10. ArrayList 使用迭代抛出ConcurrentModificationException解决方法
  11. idea2020新建一个jsp页面_有关idea2019版的jsp配置小教程
  12. 图像数据流识别圆形_python opencv :使用Hough变换检测圆形,数钱。
  13. 计算机九宫格游戏怎么玩,《九宫格数独》怎么玩 数独玩法介绍
  14. 运维 --- Nginx高级功能介绍
  15. AOP如何实现及实现原理
  16. AN515-43 COMPAL LA-H901P笔记本主板+小板点位图
  17. 清华大学超级计算机中心,中国科学技术大学超级计算中心
  18. 高级程序员的思维模式
  19. html去除背景颜色怎么设置,word文档背景颜色怎么去掉,文档背景颜色怎么去掉
  20. 【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针

热门文章

  1. python 同步event对象
  2. 学习python的日常7
  3. 为什么开源应该是云原生环境的首选
  4. 三元组相加获得target
  5. 物以类聚:对象也有生命
  6. Linux常用的配置文件
  7. “SQL对象名无效”的解决过程
  8. Windows7下安装配置PHP开发环境
  9. 关于HTML静态页面(含自动分页)生成的可行性方案
  10. 贺:MSN-.NET 技术交流群荣登群首页