我正在测试我自己的身份验证后端,如here所述。我添加了一些日志记录。请排除我所知道的这两个问题:
root
记录器(坏)error
日志级别(错误)(我只是想知道为什么我的日志消息没有显示,并且想确保我正在使用工作记录器/级别)
import logging
from django.conf import settings
from django.contrib.auth.hashers import check_password, make_password
from django.contrib.auth.models import User
class SettingsBackend:
"""
Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
Use the login name and a hash of the password. For example:
ADMIN_LOGIN = 'admin'
ADMIN_PASSWORD = 'pbkdf2_sha256$30000$Vo0VlMnkR4Bk$qEvtdyZRWTcOsCnI/oQ7fVOu1XAURIZYoOZ3iq8Dr4M='
"""
def authenticate(self, request, username=None, password=None):
logging.error('authenticate')
login_valid = (settings.ADMIN_LOGIN == username)
pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
logger.error('username={} login_valid={} pwd_valid={}'.format(username, login_valid, pwd_valid))
if login_valid and pwd_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# Create a new user. There's no need to set a password
# because only the password from settings.py is checked.
user = User(username=username)
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None
def get_user(self, user_id):
logging.error('get_user')
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
def has_perm(self, user_obj, perm, obj=None):
logging.error('has_perm')
return user_obj.username == settings.ADMIN_LOGIN
我已将此设置为我唯一的身份验证后端:
AUTHENTICATION_BACKENDS = (
'extras.auth.SettingsBackend',
# 'django.contrib.auth.backends.ModelBackend',
# 'allauth.account.auth_backends.AuthenticationBackend',
)
我已经配置了我的管理员用户:
# Used by SettingsBackend
ADMIN_LOGIN = 'admin'
ADMIN_PASSWORD = 'pbkdf2_sha256$36000$9pA3fTzM4yL9$whatever'
我在这里遇到很多问题:
login_valid = True
和pwd_valid = True
,我也无法获得经过身份验证的用户。我知道authenticate
方法被点击了,因为如果我重命名它,我会得到一个异常('SettingsBackend' object has no attribute 'authenticate'
),正如预期的那样。
我有两个问题:
第一个问题:如何显示日志条目?把它们放在顶级作品中!如下所示:
import logging
from django.conf import settings
from django.contrib.auth.hashers import check_password, make_password
from django.contrib.auth.models import User
logging.error('Loading module')
...
正如预期的那样(曾经,当模块加载时),这给了我:
ERROR:root:Loading module
第二个问题:为什么authenticate
方法失败了? (这不是那么重要,我想一旦我开始记录工作,我就能找出它有什么问题)
注意:对于记录,应用程序在wsgi
下以gunicorn
app运行。
我正在使用:
答案 0 :(得分:0)
问题与Django版本的降级有关,从Django 1.11降至Django 1.10。 authenticate
方法的签名已更改。它正在被访问,但不知何故它没有被执行,并且没有生成日志条目。
我不完全理解为什么:
authenticate
方法未执行。签名已更改,但它具有默认值,它应该仍然有效(将错误的值分配给参数)authenticate
方法的执行,为什么没有生成异常?无论如何,在将签名改编为Django 1.10预期的签名后,一切都按预期开始工作。