无法登录/无法登录Django租户

时间:2019-11-30 15:04:18

标签: django multi-tenant

背景:我正在使用django开发我的第一个多租户应用程序。我已成功遵循https://github.com/tomturner/django-tenants

给出的教程

创建租户很容易,我可以在公共和租户架构中创建用户/超级用户,并可以在locahost:8000 / admin /和mytenant.localhost:8000 / admin /

的相应租户中与这些用户登录

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

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

我无法与任何创建的用户同时访问http://localhost:8000/adminhttp://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状态代码承诺将重定向到/admin,并且它还显示已通过身份验证的用户(request.user)是超级用户,但没有进入管理页面< / p>

我已安装的应用是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 个答案:

答案 0 :(得分:0)

您在问题中说了两句话

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

解决方案

A。。从Tenant App元组中删除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',
]

您必须执行此操作,以便公共架构处理所有会话,而不是租户架构。

B。设置SESSION_COOKIE_DOMAIN = None(如果在本地主机上测试),否则 SESSION_COOKIE_DOMAIN ='.yourweb.com'。您不能在localhost上进行该跨域的单一登录,但是一旦使用您的域名部署了您的应用程序,它将支持一次登录和多个租户访问。

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

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

相关问题