Django:如何重写authenticate()方法?

2023-12-21

我用的是自定义的User,我有一个email_verified该用户的字段。 我希望当用户登录时,如果此字段为false.

我做不到views.py因为用户可以从各种来源登录(Django 站点,也可以从 REST API 登录)。 整个目的是避免为 N 个符号源编写 N 次逻辑。我想重写一个方法(login() ? authenticate()?)在 models.py 中只执行一次。

我快速阅读了有关的文档自定义身份验证 https://docs.djangoproject.com/en/dev/topics/auth/customizing/#customizing-authentication-in-django但没有找到我要找的东西。

感谢帮助。


请参考Django文档:编写身份验证后端 https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#writing-an-authentication-backend,这可能就是您所追求的。它涵盖了正常登录和 REST API(例如令牌身份验证)的用例:

The authenticate method takes credentials as keyword arguments. 
Most of the time, it’ll just look like this:

class MyBackend(object):
    def authenticate(self, username=None, password=None):
        # Check the username/password and return a User.
        ...
But it could also authenticate a token, like so:

class MyBackend(object):
    def authenticate(self, token=None):
        # Check the token and return a User.
        ...
Either way, authenticate should check the credentials it gets, 
and it should return a User object that matches those credentials, 
if the credentials are valid. If they’re not valid, it should return None.

一旦您编写了自定义身份验证后端,您只需在您的应用程序中更改默认身份验证后端即可。settings.py像这样:

AUTHENTICATION_BACKENDS = ('project.path.to.MyBackend',)

Update

而不是覆盖默认值authenticate行为,您可以在设置中包含两个后端,例如:

AUTHENTICATION_BACKENDS = ('project.path.to.MyBackend',
                           'django.contrib.auth.backends.ModelBackend',)

后端的顺序很重要,您可以阅读源代码并更好地理解默认情况authenticate并且事物协同工作(在这里阅读 https://github.com/django/django/blob/master/django/contrib/auth/backends.py)

AFAIK 这是定制的首选方式authenticate,因为有一天您可能会将默认后端更改为 RemoteUserBackend 或其他内容(例如来自 RestFramework),因此您可以按顺序将逻辑(MyBackend)放置在您的设置中,而无需担心破坏代码。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:如何重写authenticate()方法? 的相关文章

随机推荐

  • 这种不良做法/反模式的名称是什么?

    我试图向我的团队解释为什么这是不好的做法 并且正在寻找反模式参考来帮助我的解释 这是一个非常大的企业应用程序 因此这里有一个简单的示例来说明所实现的内容 public void ControlStuff var listOfThings L
  • 使用 cxf 和 java 第一种方法编写异步服务

    我需要使用 cxf 和 java 第一种方法创建一个异步 Web 服务 但我无法 找到任何可以告诉我如何执行此操作的网络资源 网站吗 您能告诉我如何使用 CXF 和 java 第一种方法编写异步 Web 服务吗 Thanks Shekhar
  • FMDB开放数据库

    我正在尝试打开资源中项目中的数据库 问题是好像找不到数据库文件 我尝试使用完整路径 它有效 但这不是一个好的解决方案 我现在想知道如何打开它 我正在使用这段代码 db FMDatabase databaseWithPath bbdd sql
  • htaccess 从 url 中删除字符并重定向

    我想脱衣 来自网址 例子 mysite com something想要重定向到mysite com something 通过启用 mod rewrite 和 htaccesshttpd conf然后将此代码放入您的 htaccess und
  • Select2:如何防止标签排序

    当用户选择许多项目 标签 时 它们会自动按字母顺序排序 如何使用Select2 4 0防止自动排序并保留用户的顺序 Update 提到的 可能的重复问题 适用于旧版本的 Select2 v3 我询问版本 4 它与旧版本不同 并且提到的答案不
  • flake8 抱怨过滤器子句中的布尔比较“==”

    我在 mysql 数据库表中有一个布尔字段 table model class TestCase Base tablename test cases obsoleted Column obsoleted Boolean 要获取所有未过时测试
  • 本地修改数据的 Firebase 同步:处理错误和全局状态

    我有两个相关问题Firebase 网络平台 https www firebase com docs web s 将本地修改的数据同步到服务器 https www firebase com docs web guide offline cap
  • 不可变的@ConfigurationProperties

    Spring Boot 是否可以拥有不可变 最终 字段 ConfigurationProperties注解 下面的例子 ConfigurationProperties prefix example public final class My
  • 在xml中引用xsd时xsl转换问题

    我对 XSL 相当陌生 需要有关转换问题的帮助 我有一个由 XSD 描述的 XML 文件 我使用 XSL 文件将 XML 转换为 HTML 我想在 XML 文件中引用 XSD 但是当我这样做时 XML 不会被转换 XML 示例
  • 您可以将宽度应用于 :before/:after 伪元素 (content:url(image)) 吗?

    这是我最近的问题的补充 是否可以使用伪元素使包含元素环绕绝对定位元素 如clearfix https stackoverflow com questions 14977324 is it possible to use pseudo ele
  • Android:进度对话框在加载时更改 ProgressDialog.setMessage()

    我希望有人可以帮助我弄清楚如何仅使用一个虚拟计时器来更改进度对话框中的设置消息对话框 该虚拟计时器通过字符串数组或任何其他方式循环 例如 在加载时 它可以说正在加载 gt 构建 gt 渲染 gt 等 就像一个 1 2 秒计时器 这只是为了我
  • 为什么 DYLD_LIBRARY_PATH 没有在这里传播?

    我有一个简单的 C 程序 我试图运行该程序 该程序与我之前构建的 Boost Thread 库的版本链接 我似乎无法理解运行时库路径在 OS X 上的行为方式 由于我的 Boost 库没有RPATH 相对安装名称 https develop
  • printf 双精度数的舍入行为

    有人可以解释这种行为吗 我很清楚浮点数的机器级表示 这似乎与 printf 及其格式有关 这两个数字都用浮点表示法精确表示 检查 乘以 64 给出一个整数 include
  • 如何将音频文件从android客户端发送到servlet服务器

    我想将音频文件 mp3 文件从 android 客户端发送到 servlet 服务器并将其保存在某个位置 如果我在该位置播放保存的 mp3 文件 它应该可以播放 我的问题是有没有办法将 mp3 文件直接从客户端发送到服务器并在 servle
  • 防病毒软件正在阻止 nodemailer - 错误:证书链中的自签名证书

    我正在使用 Nodemailer 发送电子邮件 但我的防病毒软件阻止了 Nodemailer 当我关闭防病毒软件时 发送电子邮件没有问题 有没有可能的方法使用nodemailer发送电子邮件而不禁用防病毒软件 const transport
  • 是否可以开发具有蓝牙功能的 iOS 应用程序?

    以下情况可能吗 假设我有一个具有蓝牙功能的秤 当我打开它时 它会通过 BT 发送重量 从技术上讲是否可以开发一款与体重秤配对并从中接收数据的 iOS 应用程序 据苹果公司称 技术问答 QA1657 使用外部 带蓝牙的配件框架 设备 http
  • 如何在 JavaScript 中围绕折线绘制多边形?

    我想围绕折线绘制一个多边形 在我的例子中 折线是 Google 地图方向 我需要在 Google 地图画布内显示其周围的多边形 First 对于偏移 我使用 JavaScript Clipper 库 我有以下折线 路线 我使用 Clippe
  • 在php中将地球公里转换为弧度

    我正在尝试将地球公里转换为弧度 我知道这个问题已经在其他地方得到了回答 但所有这些答案似乎都没有正确回答 到目前为止我所做的是 radians km 6371 6371 is the radius of earth in Km 它是否正确
  • 当数据库提供 ID 时添加新的 Ember.js 对象/记录

    我正在尝试 Ember js Node js 和 MongoDB 我的思路基于 Ember 网站上的精彩视频 使用 Node js Express 和 MongoDB 创建 REST API 我在 Ember js 方面遇到了障碍 试图让我
  • Django:如何重写authenticate()方法?

    我用的是自定义的User 我有一个email verified该用户的字段 我希望当用户登录时 如果此字段为false 我做不到views py因为用户可以从各种来源登录 Django 站点 也可以从 REST API 登录 整个目的是避免