【发布时间】:2018-08-05 01:06:56
【问题描述】:
我正在尝试使用 JWT 使用自定义用户模型实现 django 自定义身份验证。我已经编写了 CustomUser 模型和 CustomAuthBackend 并配置为使用 JWT。
下面是项目 settings.py 的快照:
AUTH_USER_MODEL = 'users.CustomUser'
AUTHENTICATION_BACKENDS = ('project.users.backends.CustomAuthBackend', )
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=1),
'JWT_ALLOW_REFRESH': True,
}
REST_USE_JWT = True
LOGGING = {
'version': 1,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
在使用自定义身份验证之前,我创建了 2 个用户,并在实施自定义身份验证后尝试使用其中一个凭据登录 (http://127.0.0.1:8000/admin/),但得到“请为员工帐户输入正确的电子邮件和密码。请注意,这两个字段都可能区分大小写。”消息。
尝试调试自定义身份验证,但控制台上没有打印。还尝试使用日志记录模块,但它也不起作用。所以我怀疑我的自定义身份验证函数 def authenticate(self, request, email, password) 本身可能不会被调用。
下面是代码:
from project.users.models import CustomUser
from rest_framework import authentication
import logging
class CustomAuthBackend(object):
def authenticate(self, request, email, password):
# Get an instance of a logger
print ("Inside CustomAuthBackEnd")
logger = logging.getLogger(__name__)
logger.info("Authenticating user........")
print >> sys.stderr, "debug the error"
try:
user = CustomUser.objects.get(email=email)
print("__name__: ", __name__)
print("email: ", email)
print("user: ", user)
if user.check_password(password):
return user
else:
return None
except CustomUser.DoesNotExist:
logger.error("user with login %s does not exists " % login)
return None
except Exception as e:
logger.error(repr(e))
return None
def get_user(self, user_id):
logger.info("Getting user........")
try:
user = CustomUser.objects.get(pk=user_id)
#user = CustomUser.objects.get(sys_id=user_id)
return user
#if user.is_active:
# return user
#return None
except CustomUser.DoesNotExist:
logger.error("user with %(user_id)d not found")
return None;
谁能告诉我是否调用了 def authenticate(self, request, email, password) 函数或者我该如何调试它?
使用的版本: django=2.0.1 djangorestframework==3.7.7 Python 3.4.3
【问题讨论】:
-
您说您使用的是 Python 3.4.3...
print >> sys.stderr, "debug the error"对print的使用无效 - 您应该得到一个关于无法应用>>的异常函数和sys.stderr之间的运算符 - 所以我希望如果它运行良好,你会很快得到一个异常。 -
实际上,如果可能的话,我做了很多调试来打印日志,所以我尝试了 print >> sys.stderr, "debug the error" ,但它没有工作。我在这里复制粘贴了代码,所以它保留在那里。虽然我没有得到任何异常。
-
尝试在文件顶部打印一个包含您自定义身份验证的文件,并确保它实际上位于预期的位置...确保重新加载服务器以确保它仅使用某些身份验证后端和清理你的会话表可能是值得的......
-
感谢@JonClements 我将打印件放在自定义身份验证文件的顶部。使用“python3 manage.py clearsessions”命令清除所有会话并再次运行服务器但没有运气。
标签: django python-3.x