python - 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'
它给了我同样的结果。
解决方案
我终于设法找到了解决方案:
在 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
推荐阅读
- bash - cron 作业、UTC 和美国夏令时
- c++ - C++ instanceof 适用于父类,但不适用于子类
- ansible - 当我在ansible中逐行读取文件时收到错误
- installation - Wixsharp – 将 Windows 安装程序作为 64 位进程运行
- python - NumPy 数组的标识索引
- html - 使用 bootstrap Vue 嵌套表是实现这一目标的好方法吗?
- reactjs - 在 react-table-6 中访问子表中的单元格
- docker - 无法在 Docker 桥接网络中运行 Elasticsearch 协调节点
- r - 使用 MLeval 包绘制错误的拟合颜色
- classnotfoundexception - 安装颤振时遇到问题“找不到或加载主类”在接受 android-licenses 时出现此错误