如何让多个django网站共享一个用户数据库进行身份验证?

时间:2014-05-09 14:43:26

标签: database django

我计划使用django制作2或3个网站。每个网站都有自己的主题。例如:网站A是ecomercial网站,网站B是论坛。

我希望那些网站用户可以共享一个帐户,这意味着,一个帐户,可以登录这些网站。

这意味着,他可以在论坛中创建一个帐户,并在那个网站商店购物。使用相同的用户名和passworkds等。

那些2或3个网站可能不在同一个主机中,我可能需要远程数据库进行此身份验证。

我该怎么做?

3 个答案:

答案 0 :(得分:4)

最简单的方法就是像StackExchange那样做;通过创建自己的openid提供程序。

使用python-openid非常容易,它提供sample server作为其文档的一部分。

完成设置后,使用django-social-auth与openid集成。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

这是一种替代解决方案,无需使用与auth-db相同的数据库。

此过程基于CAS(中央身份验证服务)协议,该协议支持Django和Flask框架的SSO(单一登录)和SLO(单一注销):

  1. 需要一个CAS客户端,因此我使用了名为django-cas-ng packagehere is its configuration的新一代Django-CAS作为自己的客户端。 (另外,这是pre-configured client repo
  2. 需要一个CAS服务器,所以我使用了pre-configured repo

[注意]:

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