Python 什么';身份验证和登录的区别是什么?

Python 什么';身份验证和登录的区别是什么?,python,django,django-authentication,django-1.7,Python,Django,Django Authentication,Django 1.7,文件: 手动登录用户时,必须在调用login()之前调用authenticate()。authenticate()在用户上设置一个属性,指出哪个身份验证后端成功验证了该用户的身份(有关详细信息,请参阅后端文档),稍后在登录过程中需要此信息。如果尝试直接登录从数据库检索的用户对象,则会引发错误 那么为什么authenticate和login是两个独立的函数呢?据我所知,authenticate只是验证登录信息login将获取用户对象并设置cookie。我认为它们是分开的唯一原因是,也许你可以把不同

文件:

手动登录用户时,必须在调用login()之前调用authenticate()。authenticate()在用户上设置一个属性,指出哪个身份验证后端成功验证了该用户的身份(有关详细信息,请参阅后端文档),稍后在登录过程中需要此信息。如果尝试直接登录从数据库检索的用户对象,则会引发错误


那么为什么
authenticate
login
是两个独立的函数呢?据我所知,
authenticate
只是验证登录信息
login
将获取用户对象并设置cookie。我认为它们是分开的唯一原因是,也许你可以把不同的用户对象放进去,比如说用户合并了两个帐户。也许您想先验证电子邮件地址。这就是为什么它们是独立的函数,
login
不包装
authenticate

这是一个单一责任原则的问题:一个方法应该做一件合乎逻辑的事情。正如您自己所指出的,这两个步骤在逻辑上是不同的:

authenticate
仅验证登录信息。
login
将获取用户对象并设置cookie

为了进一步澄清,身份验证是一次性检查, 而且并不意味着登录会话。 登录会话意味着一段时间,在此期间,用户可以自由执行各种受限活动,而无需重复验证检查

有时,您可能需要在不登录用户的情况下对用户进行身份验证(验证他们所说的是谁)。 如果这两种功能结合在一起, 你不能那样做, 即使你只是想做一次一次性检查, 你必须让他们登录,创建一个会话, 这没有道理。 由于这些目的明显不同, 有两种方法是完全合理的

这种分离也使测试更容易。如果您编写一个新的身份验证后端,您将希望能够测试身份验证步骤是否单独起作用,而不必担心整个登录系统如何工作,这不是后端的责任

将方法分解为最小的逻辑上独立的元素是明智的做法,有很多好处。

简单地说

验证是指验证用户凭据 然而,登录指的是在用户凭据经过验证(身份验证)后创建用户会话