我们使用django-rest-framework和django-rest-framework-jwt进行身份验证,除了django管理页面之外,它可以在任何地方使用ip:port/admin/.那仍然需要用户名和密码.
是否有设置或方法绕过它,以便它识别JWT?
/admin/页面是否总是需要使用名称/密码?我认为内置令牌auth可以使用它.
jwt是settings.py文件中唯一的auth设置.会话身份验证不再存在.
小智 6
问题是 Django 不知道 djangorestframework-jwt,而只知道 djangorestframework 本身。对我有用的解决方案是创建一个简单的中间件,利用 djangorestframework-jwt 的身份验证
在设置.py中:
MIDDLEWARE = [
# others
'myapp.middleware.jwt_auth_middleware',
]
Run Code Online (Sandbox Code Playgroud)
然后在我的 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
Run Code Online (Sandbox Code Playgroud)
重要提示:
这是一种幼稚的方法,不应在生产中运行,因此我只启用此中间件if DEBUG。如果在生产环境中运行,您可能应该像内置模块一样缓存并延迟评估用户django.contrib.auth。
小智 -1
问题可能不在于您使用的身份验证方法。如果您自定义User模型,该create_superuser方法可能不会将is_active用户实例详细信息中的标志更新为True. 这种情况下 django 身份验证后端(如果您使用ModelBackend)可以识别用户不活跃并且不允许进行身份验证。is_active简单检查 - 只需查看您创建的超级用户字段的值即可。如果是False,请手动更新为True,然后尝试登录。如果这是您问题的原因,您需要重写create_superuserUserManagercreate_user类的方法。