0

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

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

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

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

  • 我确定我没有设置 SESSION_COOKIE_SECURE = True。无论如何,我没有在开发环境中使用此设置。
  • 当我检查数据库时,django_session 表就在那里。当我尝试进行身份验证时,我没有看到正在创建新条目。
  • 我确实通过 python manage.py createsuperuser 命令创建了我的超级用户,就像我之前所做的一样。
  • 我还尝试通过 python manage.py changepassword 更改超级用户密码。
  • 我的数据库已同步,我在删除并创建新的超级用户后检查了表,并且它们已正确更新。

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

4

2 回答 2

0

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

python manage.py createsuperuser
Enter your username:
password.
于 2020-11-13T08:15:08.413 回答
0

您可以查看文件 rest_framework/authentication.py 中的 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_activeFalse不需要删除它(如果你有 FK 链接到用户on_delete=models.CASCADE,它可能会产生一些不良后果)。

于 2020-11-13T09:44:51.313 回答