背景:我正在使用django开发我的第一个多租户应用程序。我已成功遵循https://github.com/tomturner/django-tenants
给出的教程创建租户很容易,我可以在公共和租户架构中创建用户/超级用户,并可以在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状态代码承诺将重定向到/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',
)
答案 0 :(得分:0)
您在问题中说了两句话
解决方案
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”中的域(对于这个问题,我以前在这里找到了更多的技术答案,稍后我将进行链接)