Ведение пользовательского сеанса без сохранения пользователя в системе аутентификации django - PullRequest
0 голосов
/ 30 января 2020

У меня небольшое приложение 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.

...