首页 > 解决方案 > Django:自定义 http 标头身份验证

问题描述

我想为我的 Django 1.11 项目创建一个身份验证。如果请求包含标头 : ,则将对用户进行身份验证X_USERNAME。我正在使用通用视图,所以我用它LoginRequiredMixin来控制访问。

我做了这个自定义身份验证类:

class CustomAuthentication:
    def authenticate(self, request):
        username = request.META.get('X_USERNAME')
        logging.warning(username)
        if not username:
            return None
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            user = User(username=username)
            user.is_staff = False
            user.is_superuser = False
            if request.META.get('X_GROUPNAME') == 'administrator':
                user.is_staff = True
                user.is_superuser = True
            user.save()
        return user, None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

我在我的设置中添加了它:

AUTHENTICATION_BACKENDS = ['path.to.file.CustomAuthentication']

但我不能让它工作。我被重定向到/accounts/login/?next=不存在的地方。

提前致谢!

编辑:

我还尝试创建一个子类,如此处所述:Django RemoteUser 文档,因为它看起来像我想要实现的目标:

class CustomAuthentication(RemoteUserMiddleware):
    header = 'HTTP_X_USERNAME'

它给了我同样的结果。

标签: pythondjangoauthenticationhttp-headers

解决方案


我终于设法找到了解决方案:

在 authentication.py 中:

from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomMiddleware(RemoteUserMiddleware):
    header = 'HTTP_X_USERNAME'

第二次导入是强制性的,我不知道为什么。

在 settings.py 中:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'app.authentication.CustomMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

AUTHENTICATION_BACKENDS = ['app.authentication.RemoteUserBackend']

最后在我使用的基于类的视图中LoginRequiredMixin

请参阅:https ://docs.djangoproject.com/en/3.2/howto/auth-remote-user/#configuration


推荐阅读