gpt4 book ai didi

django - 多个 Django 应用程序,共享身份验证

转载 作者:行者123 更新时间:2023-12-04 01:49:22 28 4
gpt4 key购买 nike

这个问题的两个答案,取决于共享是跨不同站点还是不同子域第二个答案:Multiple Django apps, shared authentication

用户转到 site1.com 并登录。现在,如果他转到 site2.com,那么他应该已经在该站点登录(经过身份验证)。

site1.com 和 site2.com 由同一服务器上的不同 Django 应用程序处理。

我知道这些站点可以共享包含身份验证表的数据库。我不明白的是 session 数据是如何处理的。用户登录到站点 1 后,转到站点 2。在这里他总是有 request.user = "AnonymousUser: AnonymousUser"而不是 user_id。

我已将其设置为:https://docs.djangoproject.com/en/dev/topics/db/multi-db/ :

site1 的设置有一个单一的数据库,其中包含身份验证模型以及一些其他数据表。 site2 的设置有 2 个数据库。一张有自己的数据表,也是user1使用的一张。我基本上复制了 AuthRouter 类并设置了数据库路由器。

我正在尝试做的事情是不可能的吗?我实际上不明白这两个站点如何共享 session 数据。我需要 Django 之外的一些特别的东西吗?或者这应该工作?我可以在这里包含我的代码,但如果我对此的基本想法是错误的,我不想混淆这个问题。

编辑:这是我的设置。我正在本地主机上尝试这个。

Site1 在 localhost:8080 上运行

site2 在 localhost:8000 上运行

SITE2 APP:

db_router.py:

class AuthRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'auth':
return 'the_ui'
return None
# same for write

def allow_syncdb(self, db, model):
if db == 'the_ui':
return model._meta.app_label == 'auth'
elif model._meta.app_label == 'auth':
return False
return None

class OtherRouter(object):
def db_for_read(self, model, **hints):
return "default"
# same for write, relation, syncdb

设置.py:
DATABASE_ROUTERS = ['site2_app.db_router.AuthRouter', 'site2_app.db_router.OtherRouter']
SESSION_COOKIE_DOMAIN = 'http://localhost:8080'
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

DATABASES = {
'default': {
# ...
},
'the_ui': {
# ...
}
}

站点 1 应用程序:
# no router
# only single database, same as the "the_ui" used in site2
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

最佳答案

正如您所说,这两个站点可以通过共享数据库或在各自数据库之间同步用户表来拥有相同的身份验证数据。

这将确保site1.com 的任何用户将自动成为site2.com 的成员,反之亦然。

但是您的要求 - 任何登录到 site1.com 的用户都应该自动登录到 site2.com 有点棘手。您真正需要的是Single Sign On (SSO).

为什么不能仅仅通过共享数据库(包括 session 数据)来实现,因为site2.com 永远无法在浏览器上访问site1.com 设置的cookie。跨域问题。

有许多使用 Django 的 SSO 解决方案。看看this所以问题。虽然我没用过,Django-openid似乎是一个不错的选择。

关于django - 多个 Django 应用程序,共享身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230202/

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