如何让多个Django网站共享一个用户数据库进行认证?

3
我计划使用Django制作2到3个网站,每个网站都有自己的主题,例如:网站A是电商网站,网站B是论坛。
希望这些网站的用户可以共享一个账户,也就是说,一个账户可以登录这些网站。
这意味着他可以在论坛上创建一个账户,然后在网站商店购物。使用相同的用户名和密码等信息。
而这2到3个网站可能不在同一台主机上,我可能需要远程数据库来进行身份验证。
我该如何做到这点呢?
3个回答

4
Django文档涵盖了有关配置多个数据库的内容,可以在这里查看。在多个项目中使用相同的“auth_db”和AuthRouter应该可以工作。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'auth_db': {
        'NAME': 'auth_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'HOST': '127.0.0.1',
        'PASSWORD': 'swordfish',
    },

}


class AuthRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        if obj1._meta.app_label == 'auth' or \
           obj2._meta.app_label == 'auth':
           return True
        return None

    def allow_migrate(self, db, model):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if db == 'auth_db':
            return model._meta.app_label == 'auth'
        elif model._meta.app_label == 'auth':
            return False
        return None

我在一个网站上设置一个RESTful API,然后其他网站发送认证信息到这个API来检查用户登录信息怎么样?这样,我就不需要修改数据库,并且可以在远程网站中使用。一个主网站,多个客户网站。只需将客户网站的IP保留在主网站的检查列表中。来自其他IP的任何请求都将被忽略。 - zzlettle
你不需要修改任何数据库,auth_db可以是另一个Django项目的默认数据库。 - Chris Montanaro
同时,数据库也可以是远程的,只需更新主机设置为您的数据库安装的远程主机/IP即可。 - Chris Montanaro

4
这样做的最简单方法,就像StackExchange所做的那样,是创建自己的openid提供者。
使用python-openid非常容易,它提供了一个示例服务器作为其文档的一部分。
一旦设置好了,就可以使用django-social-auth来集成openid。

1
这并没有回答被问到的问题,尽管我同意这是一个很好的替代方案。 - Ben

0

这里提供了一种不使用与auth-db相同的数据库的替代解决方案。

该过程基于CAS(Central Authentication Service)协议,支持Django和Flask框架的SSO(单点登录)和SLO(单点注销):

  1. 需要一个CAS-Client,我使用了新一代的Django-CAS,称为django-cas-ng package,并在此处配置以创建自己的客户端。(此外,这里还有一个预配置的客户端repo
  2. 需要一个CAS-Server,我使用了一个预配置的repo

[注意]:

  • 它支持 Django 1.11,2.x 和 3.x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接