“authenticate”和“login”有什么区别?

25

文档:https://docs.djangoproject.com/en/1.7/topics/auth/default/#django.contrib.auth.login

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

那么为什么 authenticatelogin 是两个单独的函数呢?据我所知,authenticate 只是验证登录信息。 login 将获取的用户对象并设置cookie。我唯一能想到的原因是,也许您可以放入不同的用户对象,例如用户合并了 2 个帐户。也许您想先验证电子邮件地址。这就是它们为什么是单独的函数而 login 不包装 authenticate 的唯一原因吗?

3个回答

29

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

authenticate 只验证登录信息。 login 将用户对象设置为 cookie。

更进一步澄清,认证是一次性检查,并不意味着登录会话。 登录会话意味着在某段时间内,用户可以进行各种受限制的活动而无需重复进行身份验证。

有时候您可能需要对用户进行身份验证(验证他们是否说的是他们自己),而不需要将其登录。 如果这两个功能被合并为一个, 即使您只想进行一次性检查, 也不能这样做,您必须将其登录,创建会话, 这是没有意义的。 由于这些目的明显是不同的, 因此拥有两种方法是很有道理的。

分离还使测试变得更容易。如果您编写新的身份验证后端,您希望能够测试身份验证步骤是否正常工作,而不必担心整个登录系统的工作方式,因为这不是您的后端的责任。

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


17

简单来说,

认证是指验证用户的凭据, 而登录是指在用户凭证已经通过验证(认证)后创建一个用户会话。


1

认证是识别用户并验证其身份的过程。密码是建立身份的最常见和最显著的措施之一。

如果用户名与密码凭据匹配,并且系统允许用户访问,则身份有效。

登录是计算机和信息安全领域中,个人在经过识别和身份验证后,获得访问某些资源、计算机系统或网络的标准过程。

用户名通常由用户凭据组成,而登录则由密码组成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接