gpt4 book ai didi

django - 无法登录/无法登录 django 租户

转载 作者:行者123 更新时间:2023-12-05 07:16:43 26 4
gpt4 key购买 nike

背景:我正在使用 Django 开发我的第一个 Multi-Tenancy 应用程序。我已经成功按照 https://github.com/tomturner/django-tenants 给出的教程进行操作

创建租户很容易,我可以在公共(public)和租户模式中创建用户/ super 用户,并可以在 locahost:8000/admin/和 mytenant.localhost:8000/admin/的相应租户中使用这些用户登录

但需要对与多个租户相关的用户进行全局身份验证(每个域而不是每个子域的单独登录)所以我使用了 https://github.com/Corvia/django-tenant-users

我仍然可以使用以下代码成功创建租户和用户(以及数据库中的物理模式)。但问题是

我无法访问(即使在登录成功后)位于 http://localhost:8000/admin 的管理页面和 http://mytenant.localhost:8000/admin与任何创建的用户,遗憾的是我根本没有收到任何消息

    public_owner = "owner@local"
create_public_tenant("localhost", public_owner)
public_admin = "admin@local"
TenantUser.objects.create_superuser('xxx', public_admin)

tenant_super_user = "admin@" + tenant_name
TenantUser.objects.create_superuser('xxx', tenant_super_user)
provision_tenant(tenant_name, tenant_name, tenant_super_user)

更多详情:我尝试调试我的 django 登录功能,它成功登录并且它的 302 状态代码 promise 重定向到 /admin 并且它还显示经过身份验证的用户(request.user)是 super 用户,但没有去到管理页面

我安装的应用程序是 settings.py 是

    SHARED_APPS = (
'django_tenants',
'django.contrib.admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tenant_users.permissions',
'tenant_users.tenants',
'customers', # you must list the app where your tenant model resides in
'users',
)

TENANT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'tenant_users.permissions',
'django.contrib.admin',
'django.contrib.sessions',
'django.contrib.messages',
'tenant_only',
)

最佳答案

你在问题​​中说了两件事

  1. 当您登录到管理员时没有显示任何消息,这是因为您的 session Cookie 域配置不正确,请参见下面的代码。
  2. 您希望所有租户都可以登录一次,并且他们必须能够在他们有权访问的子域之间跳转。

解决方案

A. 从租户应用元组中删除 django.contrib.sessions。您的应用程序定义在 settings.py 中应该看起来像这样

# Application definition
SHARED_APPS = (
'django_tenants', # mandatory
# ...
'django.contrib.admin',
'django.contrib.auth', # Defined in both shared apps and tenant apps
'django.contrib.contenttypes', # Defined in both shared apps and tenant apps
'tenant_users.permissions', # Defined in both shared apps and tenant apps
'tenant_users.tenants', # Defined only in shared apps
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'public', # Custom defined app that contains the TenantModel. Must NOT exist in TENANT_APPS
'users', # Custom app that contains the new User Model (see below). Must NOT exist in TENANT_APPS
# ...
)

TENANT_APPS=[
'django.contrib.admin',
'django.contrib.auth', # Defined in both shared apps and tenant apps
'django.contrib.contenttypes', # Defined in both shared apps and tenant apps
'tenant_users.permissions', # Defined in both shared apps and tenant apps
'django.contrib.messages',
'django.contrib.staticfiles',

'tenant',
]

您必须这样做,以便公共(public)架构处理所有 session 而不是租户架构。

B. 设置 SESSION_COOKIE_DOMAIN = None(如果您在本地主机上测试)SESSION_COOKIE_DOMAIN = '.yourweb.com'。您不能在本地主机上进行跨域单点登录,但一旦您的应用程序使用您的域名部署,它将支持一次登录和 Multi-Tenancy 访问。

    if DEBUG:
SESSION_COOKIE_DOMAIN = None
else:
SESSION_COOKIE_DOMAIN = '.yourdomain.com'

PS:在本地主机上,每次从一个子域跳转到另一个子域时都必须登录,这是因为 session cookie 域需要两个“.”。识别不在“.l​​ocalhost”中的域(我之前在这里找到了这个问题的更多技术答案,稍后我将链接)

关于django - 无法登录/无法登录 django 租户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59117378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com