实施 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 问题的一些答案:
- 我确定我没有设置 SESSION_COOKIE_SECURE = True。无论如何,我不会在开发环境中使用此设置。
- 当我检查数据库时,django_session table 在那里。当我尝试进行身份验证时,我没有看到正在创建的新条目。
- 我确实通过 python manage.py createsuperuser 命令创建了我的超级用户,就像我以前做的一样。
- 我还尝试通过 python manage.py changepassword 更改超级用户密码。
- 我的数据库已同步,我在删除和创建新的超级用户后检查了 tables,它们已正确更新。
这些步骤没有改变任何东西。然后我为新的超级用户设置 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的用户=],它可能会产生一些不良后果)。
在实施 DRF authtoken 应用程序后,我删除了我以前的超级用户(因为它没有授权令牌)并创建了一个新的。查看数据库,我看到新的超级用户在 authtoken_token table 中有一个条目。它还将 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 table 在那里。当我尝试进行身份验证时,我没有看到正在创建的新条目。
- 我确实通过 python manage.py createsuperuser 命令创建了我的超级用户,就像我以前做的一样。
- 我还尝试通过 python manage.py changepassword 更改超级用户密码。
- 我的数据库已同步,我在删除和创建新的超级用户后检查了 tables,它们已正确更新。
这些步骤没有改变任何东西。然后我为新的超级用户设置 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的用户=],它可能会产生一些不良后果)。