Django:如何存储子域名

我需要创建一个基于子域的身份验证系统,如37信号,新书,代码库使用。 也就是说,我的主应用程序的每个子域需要有自己的用户名称空间。 我想尽可能地保留django认证系统。

什么是存储用户名的好方法?

特别是,只要其帐户属于不同的子域,不同的用户应该可以拥有相同的用户名。

我已经考虑了一些方法,为此我可以预见到一些缺点:

  • 在django auth用户模型的用户名字段中存储一些前缀。
  • 根据这个扩展用户模型。
  • 根据我的需要定制auth的来源

  • 过去我已经为几个网站构建了这个功能,并且发现你的第一个要点是要走的路。

    这意味着您不必对django auth进行大规模更改。 我所做的是建立了一个自定义身份验证后端,用于抽象存储用户名的方式。

    auth_backends.py
    
    from django.contrib.auth.backends import ModelBackend
    
    from Home.models import Account
    
    class CustomUserModelBackend(ModelBackend):
        def authenticate(self, subdomain, email, password):
            try:
                user = Account.objects.get(username=u'%s.%s' % (subdomain, email))
                if user.check_password(password):
                    return user
            except Account.DoesNotExist:
                return None
    
        def get_user(self, user_id):
            try:
                return Account.objects.get(pk=user_id)
            except Account.DoesNotExist:
                return None
    

    对于这个特定的项目Account是用户模型,它只是直接从用户继承,但你可以用你想要的任何东西替换Account

    您必须在设置文件中安装自定义身份验证后端:

    AUTHENTICATION_BACKENDS = (
        'auth_backends.CustomUserModelBackend',
        'django.contrib.auth.backends.ModelBackend',
    )
    

    然后当你打电话进行authenticate你需要传入子域名,电子邮件和密码。

    您还可以添加一些其他帮助函数或模型方法,以帮助确保只显示用户的实际用户名,但这些都很简单。


    我认为这可能是将django.contrib.sites与您提到的第二个项目符号结合使用的一个很好的用例。 你可以像这样创建一个CustomUser模型:

    from django.contrib.sites.models import Site
    
    class CustomUser(User):
        """User with app settings."""
        sites = models.ManyToManyField(Site)
    

    然后,您可以编写自定义身份验证后端,以检查用户是否可以使用提供的凭据登录到当前子域。 这使您可以拥有多个网站(子域名)的一个用户名,而无需破解内部身份验证应用或存储具有自定义前缀的多个用户名。

    编辑 :您可以使用Site.objects.get_current()获取当前网站,然后检查当前网站是否位于用户的网站中。

    您可以在这里阅读关于网站框架的更多信息:http://docs.djangoproject.com/en/dev/ref/contrib/sites/

    链接地址: http://www.djcxy.com/p/875.html

    上一篇: Django: how to store subdomain

    下一篇: Saving Changes to Related Objects in Detached State