实施 DRF 令牌身份验证后无法立即登录到 django admin。将 is_active 设置为 True 修复了它。为什么?

Cannot login to django admin right after implementing DRF token authentication. Setting is_active to True fixed it. Why?

在实施 DRF authtoken 应用程序后,我删除了我以前的超级用户(因为它没有授权令牌)并创建了一个新的。查看数据库,我看到新的超级用户在 authtoken_token table 中有一个条目。它还将 is_admin、is_staff 和 is_superuser 设置为 True。 is_active 设置为 False 但这在之前的超级用户中也设置为 False 并且登录到 admin 没有问题。

当我使用 is_active=False 在管理页面中输入凭据时,它显示:

“请输入正确的员工帐户电子邮件和密码。请注意,这两个字段可能区分大小写。”

在设置 is_active=True 之前,我试过的其他 SO 问题的一些答案:

这些步骤没有改变任何东西。然后我为新的超级用户设置 is_active=True,我终于可以登录了。但为什么?在 DRF 令牌身份验证之前,我的非活动超级用户可以登录到管理员。现在,它不能,它应该是活动登录。这与令牌认证有什么关系? (所以我的问题解决了,但我想知道 django 和 drf 在门后是如何工作的。)

您是否使用此命令创建了超级用户

python manage.py createsuperuser
Enter your username:
password.

您可以查看文件 rest_framework/authentication.py.

中的 class TokenAuthentication(继承自 BaseAuthentication)

在这里你会找到方法:

def authenticate_credentials(self, key):
    model = self.get_model()
    try:
        token = model.objects.select_related('user').get(key=key)
    except model.DoesNotExist:
        raise exceptions.AuthenticationFailed(_('Invalid token.'))

    if not token.user.is_active:
        raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))

    return (token.user, token)

如您所说,token.user.is_active 上有一个禁止连接的保护。因此你的管理员问题!

然后你可以问“为什么是这个系统?”因为多亏了那个,当你删除一个用户时,你只需要把is_active放到False,不需要删除它(如果你FK link到[=13的用户=],它可能会产生一些不良后果)。