Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django身份验证系统中维护用户会话而不保存用户_Python_Django_Django Authentication - Fatal编程技术网

Python 在django身份验证系统中维护用户会话而不保存用户

Python 在django身份验证系统中维护用户会话而不保存用户,python,django,django-authentication,Python,Django,Django Authentication,我有一个小的Django应用程序,其中用户需要通过安装在Apache上的Webgate插件进行外部身份验证。Webgate将使用托管在intranet上的其他企业身份验证系统对进入my django站点的用户进行身份验证。一旦企业身份验证系统对用户进行了身份验证,它将使用REMOTE-user标头将用户重定向到我们的站点。此标题将包含用户名。我只需要确保该标题中提到的用户能够访问该站点,即使该站点在我的站点上不存在,相信他已经通过了身份验证。 为此,我正在使用 MIDDLEWARE = [

我有一个小的Django应用程序,其中用户需要通过安装在Apache上的Webgate插件进行外部身份验证。Webgate将使用托管在intranet上的其他企业身份验证系统对进入my 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这可能吗?如果是,我如何才能做到这一点? 我尝试如下子类化AllowlUsersRemoteUserBackend,并重写authenticate方法以返回一个仅在内存中而不是在DB中的用户

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

现在我不是在apache上运行代码,而是在django开发服务器上运行。我正在通过另一个中间件手动添加包含用户名的标题。目标是让基本的东西工作起来,然后将代码部署到apache。

我能够通过使用以下设置解决这个问题

MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',  
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'module.CheckIDMHeaderMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
AUTH_USER_MODEL = 'auth.User'

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [],
    'UNAUTHENTICATED_USER': None,
}
必须创建自己的用户类

class User:
username = ''
user_permissions = []
is_active = True

def get_user_permissions(self):
    return self.user_permissions

def __init__(self, username):
    self.username = username
    self.is_active = True
在CheckIDMHeadermiddware的调用方法中,我正在读取包含从webgate插件获得的用户名的标题。使用该用户名,我在it会话中创建了一个用户对象和设置

def __call__(self, request):
    # some code skipped to keep the answer simple.
    ....
    username = request.META[header_name]
    user = User(username = username)
    request.user = user
    response = self.get_response(request)
    return response
    ....
    # some code skipped to keep the answer simple.
            

..

我可以通过使用以下设置来解决此问题

MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',  
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'module.CheckIDMHeaderMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
AUTH_USER_MODEL = 'auth.User'

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [],
    'UNAUTHENTICATED_USER': None,
}
必须创建自己的用户类

class User:
username = ''
user_permissions = []
is_active = True

def get_user_permissions(self):
    return self.user_permissions

def __init__(self, username):
    self.username = username
    self.is_active = True
在CheckIDMHeadermiddware的调用方法中,我正在读取包含从webgate插件获得的用户名的标题。使用该用户名,我在it会话中创建了一个用户对象和设置

def __call__(self, request):
    # some code skipped to keep the answer simple.
    ....
    username = request.META[header_name]
    user = User(username = username)
    request.user = user
    response = self.get_response(request)
    return response
    ....
    # some code skipped to keep the answer simple.