该问题的两个答案,取决于共享是在不同站点之间还是在不同子域中进行共享第二个答案:多个Django应用程序,共享身份验证
用户访问site1.com并登录。现在,如果他访问site2.com,则该用户应该已经在该站点登录(通过身份验证)。
site1.com和site2.com由同一服务器上的不同Django应用程序处理。
我知道这些站点可以共享包含身份验证表的数据库。我没有得到的是如何处理会话数据。登录到site1后,用户将转到site2。在这里,他始终具有request.user =“ AnonymousUser:AnonymousUser”而不是user_id。
我已经将其设置为:https : //docs.djangoproject.com/en/dev/topics/db/multi-db/:
site1的设置只有一个数据库,其中包含auth模型以及其他一些数据表。site2的设置有2个数据库。一个有自己的数据表,还有一个由user1使用的数据表。实际上,我复制了AuthRouter类并设置了数据库路由器。
我想做的事不可能吗?我实际上不了解这两个站点如何共享会话数据。在Django之外,我是否需要特殊的东西?还是应该工作?我可以在这里包含我的代码,但是如果我的基本想法是错误的,则不要混淆这个问题。
编辑:这是我的设置。我正在localhost上尝试此操作。
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
settings.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 APP:
# no router
# only single database, same as the "the_ui" used in site2
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
如您所说,这两个站点可以通过共享数据库或在各自数据库之间同步Users表来使用相同的身份验证数据。
这将确保site1.com的任何用户都将自动成为site2.com的成员,反之亦然。
但是您的要求-任何登录site1.com的用户都应该自动登录site2.com有点棘手。您真正需要的是单一登录(SSO)。
为什么它不能仅仅通过共享数据库(包括会话数据)来实现是因为site2.com不能获得对由于浏览器通过site1.com访问设置Cookie跨域问题。
有许多使用Django的SSO解决方案。看看这个SO问题。尽管我从未使用过它,但Django-openid似乎是一个不错的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句