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

标签 django multi-tenant

背景:我正在使用 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/

相关文章:

python - 将 Django 应用程序迁移到 Google App Engine?

python - pytest-django:这是用参数测试 View 的正确方法吗?

java - 如何为 Multi-Tenancy 配置 Spring Oauth2

jakarta-ee - 如何在 Multi-Tenancy 环境中使用 JPA @Column(unique = true)?

multi-tenant - Shiro 的 Multi-Tenancy

asp.net-mvc - 将 NHibernate 应用程序转换为 Multi-Tenancy 的最佳实践?

python - 使用旧数据库时 Django MultipleObjectsReturned

django - docker-compose 中的collectstatic权限问题

ruby-on-rails-4 - 在 Rails 中使用 Postgres 多模式数据库

django - 如何将 Django 与 Azure Cosmos DB 结合使用?