【问题标题】:Django Custom Authentication not workingDjango 自定义身份验证不起作用
【发布时间】: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


【解决方案1】:

尝试了很多东西,但有效的是 Django Shell。

运行“python3 manage.py shell”,你会进入shell提示符。

现在因为我已经实现了自定义身份验证,所以如果我导入 from django.contrib.auth import authenticate 并从 shell 提示符调用身份验证函数,然后我的自定义身份验证函数应该被调用(如果一切实施和配置正确)。我尝试了同样的方法,打印开始出现。

之前发生的事情是验证函数本身没有被调用,因此没有打印出来。

我能弄清楚的原因是我将它实现为 def 身份验证(自我、请求、电子邮件、密码) 但如果我(从外壳)称它为 authenticate(username="root", password="password123") 它不会被调用,但如果我调用为 authenticate(email="root@gmail.com", password="password123") 那么它将被调用并在内部 Django 框架可能是第一种方式。

我是 python、django 的新手,所以我不知道里面发生了什么,但看起来像参数名称,同时调用函数应该与函数定义中的参数名称匹配。

【讨论】:

猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多