У меня небольшое приложение Django, в котором пользователи должны проходить внешнюю аутентификацию с помощью плагина Webgate, установленного на Apache. Webgate будет использовать другую корпоративную систему аутентификации, размещенную в intr anet, для аутентификации пользователей, заходящих на мой django сайт. Как только система аутентификации предприятия аутентифицирует пользователя, она перенаправляет их на наш сайт с заголовком REMOTE-USER. Этот заголовок будет содержать имя пользователя. Мне просто нужно убедиться, что пользователь, упомянутый в этом заголовке, может получить доступ к сайту, даже если он не существует на моем сайте, полагая, что он уже аутентифицирован. Для этого я использую
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
]
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.RemoteUserBackend',
)
Это работает. Но это создает пользователей на сайте. Требование заключается в том, что пользователи не должны существовать в нашей базе данных. Они могут существовать в памяти. Им нужно провести сеанс Возможно ли это даже в Django? Если да, то как мне этого добиться? Я попытался создать подкласс AllowAllUsersRemoteUserBackend, как показано ниже, и переопределить метод authenticate для возврата пользователя, который находится только в памяти, а не в БД.
class AllowAllUsersRemoteUserBackendWithoutCreatingUnknownUsers(AllowAllUsersRemoteUserBackend):
create_unknown_user = False
def authenticate(self, request, remote_user):
return User(username = remote_user)
AUTHENTICATION_BACKENDS = (
'polls.middleware.authentication.AllowAllUsersRemoteUserBackendWithoutCreatingUnknownUsers',
)
Но с этим я получаю исключение
ValueError at /polls/
Cannot force an update in save() with no primary key.
Request Method: GET
Request URL: http://localhost:8001/polls/
Django Version: 2.1.7
Exception Type: ValueError
Exception Value:
Cannot force an update in save() with no primary key.
Exception Location: C:\Users\rizwan_shaikh\Envs\sessiontest\lib\site-packages\django\db\models\base.py in _save_table, line 803
Python Executable: C:\Users\rizwan_shaikh\Envs\sessiontest\Scripts\python.exe
Python Version: 3.8.1
Python Path:
['C:\\ApplicationCode\\Kenstar\\sessiontest\\djangosessiontestwithwsgi',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest\\Scripts\\python38.zip',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest\\DLLs',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest\\lib',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest\\Scripts',
'c:\\softwares\\pythoninstallation\\Lib',
'c:\\softwares\\pythoninstallation\\DLLs',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest',
'C:\\Users\\rizwan_shaikh\\Envs\\sessiontest\\lib\\site-packages',
'/app',
'/usr/local/lib/python3.7/site-packages']
Server time: Thu, 30 Jan 2020 08:37:34 +0000
Right теперь я не запускаю свой код на apache, скорее я работаю на django сервере разработки. Я вручную добавляю заголовок, содержащий имя пользователя, через другое промежуточное ПО. Цель состоит в том, чтобы заставить работать базовый c материал, а затем развернуть код в apache.