django管理页面和JWT
我们使用django rest框架和django rest框架jwt进行身份验证,除了位于django管理页面和JWT,django,jwt,Django,Jwt,我们使用django rest框架和django rest框架jwt进行身份验证,除了位于ip:port/admin/的django admin页面之外,它在任何地方都可以工作。仍然需要用户名和密码 是否有设置或方法绕过该设置或方法,以便它识别JWT 是否总是需要/admin/页面才能使用名称/密码?我认为内置的令牌auth可以使用它 jwt是settings.py文件中唯一的身份验证集。会话身份验证不再存在。问题可能不在您使用的身份验证方法中。如果自定义User模型,则可能会发生create\
ip:port/admin/
的django admin页面之外,它在任何地方都可以工作。仍然需要用户名和密码
是否有设置或方法绕过该设置或方法,以便它识别JWT
是否总是需要/admin/
页面才能使用名称/密码?我认为内置的令牌auth可以使用它
jwt是settings.py文件中唯一的身份验证集。会话身份验证不再存在。问题可能不在您使用的身份验证方法中。如果自定义
User
模型,则可能会发生create\u superuser
方法未将用户实例详细信息中的is\u active
标记更新为True
。这种情况下,django身份验证后端(如果您使用modelbend
)可以识别用户未处于活动状态,并且不允许进行身份验证。简单检查-只需查看您创建的超级用户的字段中有哪些值处于活动状态。如果它False
,请手动将其更新为True
,然后尝试登录。如果这是问题的原因,您需要重写UserManager类的create_superuser
和create_user
方法。问题是Django不知道djangorestframework jwt,而只知道djangorestframework本身。对我有效的解决方案是创建一个利用djangorestframework jwt的auth的简单中间件
在settings.py中:
MIDDLEWARE = [
# others
'myapp.middleware.jwt_auth_middleware',
]
然后在myapp/middleware.py中
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from django.contrib.auth.models import AnonymousUser
from rest_framework import exceptions
def jwt_auth_middleware(get_response):
"""Sets the user object from a JWT header"""
def middleware(request):
try:
authenticated = JSONWebTokenAuthentication().authenticate(request)
if authenticated:
request.user = authenticated[0]
else:
request.user = AnonymousUser
except exceptions.AuthenticationFailed as err:
print(err)
request.user = AnonymousUser
response = get_response(request)
return response
return middleware
重要提示:
这是一种幼稚的方法,您不应该在生产环境中运行,因此我只在调试时启用此中间件。如果在生产环境中运行,您可能应该像内置的django.contrib.auth
模块那样缓存并延迟评估用户。如果有一些简单的问题我可能刚刚忽略了,我很抱歉。我已经使用扩展将JWT直接插入到请求头中,这适用于除/admin/
之外的所有URL。它适用于/schemaview/
甚至rest framework api视图。您好,这里有相同的问题,正在寻找相同的解决方案。你能在这段时间内想出点什么吗?我还没想出。这不是一个高优先级的任务,但我可能需要在不久的将来。我一直在使用一个活跃的用户。使用chrome修改请求,我将令牌添加到头中。我可以访问除/admin/页面之外的所有内容。已经有一段时间了,很好地处理了这个问题。我会再核实一下