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

use*_*003 11 django django-authentication

这个问题的两个答案,取决于是否跨不同站点或不同子域共享第二个答案:多个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
Run Code Online (Sandbox Code Playgroud)

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': {
        # ...
    }
}
Run Code Online (Sandbox Code Playgroud)

第1页APP:

# no router
# only single database, same as the "the_ui" used in site2
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
Run Code Online (Sandbox Code Playgroud)

use*_*003 16

基于使用不同站点的初始问题,标记的答案是正确的.

以下是不同子域的答案,例如www.site.com和shop.site.com

使用问题中描述的共享数据库身份验证.然后,在两个settings.py中:

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
SESSION_COOKIE_DOMAIN = '.site.com' #notice the period
SESSION_COOKIE_NAME = 'my_cookie'
SECRET_KEY = "" the same in both settings.py
Run Code Online (Sandbox Code Playgroud)

如果您有其他不应共享此信息的子域,可能会出现一些问题.或者,也许不是,如果你给他们的饼干不同的名字?

不确定这是否适用于localhost.

  • 它不适用于`localhost`但如果你将`127.0.0.1 site.dev`添加到`/ etc/hosts`它适用于`site.dev` (2认同)

Sud*_*pta 3

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

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

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

之所以不能仅仅通过共享数据库(包括会话数据)来实现,是因为由于跨域问题,site2.com永远无法在浏览器上访问site1.com设置的cookie 。

有许多使用 Django 的 SSO 解决方案。看看这个问题。虽然我从未使用过它,但Django-openid似乎是一个不错的选择。