如何在“站点”框架支持的多个Django站点中获得独特用户?

时间:2009-09-10 08:46:01

标签: django django-sites

我正在构建一个Django站点框架,该框架将为几个独立站点提供支持,所有站点都使用相同的应用程序,但使用自己的模板。我计划通过使用多个设置文件并为它们设置唯一的SITE_ID来完成此操作,如django.contrib.sites framework

的Django文档中所建议的那样

但是,我不希望站点A的用户能够在站点B上登录。在检查syncdb创建的用户表之后,我看不到可能将用户限制到特定站点的列。我还尝试在一个站点上创建一个用户'bob',然后使用shell命令列出另一侧的所有用户,果然,bob显示在那里。

如何确保所有用户都被限制在各自的网站上?

3 个答案:

答案 0 :(得分:25)

最兼容的方法是创建一个user Profile model,其中包含Site模型的外键,然后编写一个custom auth backend,根据该FK的值检查当前站点。一些示例代码:

定义您的个人资料模型,例如在app / models.py中:

from django.db import models
from django.contrib.sites.models import Site
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    site = models.ForeignKey(Site)

编写自定义身份验证后端,继承默认后端,让我们说在app / auth_backend.py中:

from django.contrib.auth.backends import ModelBackend
from django.contrib.sites.models import Site

class SiteBackend(ModelBackend):
    def authenticate(self, **credentials):
        user_or_none = super(SiteBackend, self).authenticate(**credentials)
        if user_or_none and user_or_none.userprofile.site != Site.objects.get_current():
            user_or_none = None
        return user_or_none

    def get_user(self, user_id):
        try:
            return User.objects.get(
                pk=user_id, userprofile__site=Site.objects.get_current())
        except User.DoesNotExist:
            return None

此身份验证后端假定所有用户都有个人资料;您需要确保您的用户创建/注册过程始终创建一个。

重写的authenticate方法可确保用户只能在正确的网站上登录。根据用户会话中存储的身份验证信息,每次从数据库中获取用户的请求都会调用get_user方法;我们的覆盖确保用户无法在站点A上登录,然后使用相同的会话cookie来获取对站点B的未授权访问。(感谢Jan Wrobel指出需要处理后一种情况。)

答案 1 :(得分:2)

您可以插入自己的授权和身份验证后端,并考虑网站ID。

请参阅django文档中的other authentication sourcesauthentication backends references

除此之外,如果您的django源太旧,您可以自己修改authenticate()或login()代码。毕竟......这不是开源的奇迹之一。请注意,这样做可能会影响您与其他模块的兼容性。

希望这有帮助。

答案 2 :(得分:-1)

你必须要知道,许多人抱怨Django默认授权系统和权限 - 它只是对象的规则,对象的实例 - 这意味着什么,没有编写任何代码就不可能。< / p>

但是,有一些授权挂钩可以帮助您实现这一目标,例如:

看看那里: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py 和课程许可。

您可以添加自己的权限并为其定义规则(对于User和ContentType有一个ForeignKey)。

但是,没有monkeypatching /改变某些方法可能会很困难。

相关问题