如何获得独特的用户遍及搭载了“地王”的框架多个Django的网站?(How to get uniqu

2019-07-17 14:17发布

我建立一个Django站点框架,将功率几个独立的网站,都使用相同的应用程序,但与自己的模板。 我打算通过使用多种设置,文件和设置唯一SITE_ID为他们做到这一点,像在暗示Django文档的django.contrib.sites框架

不过,我不希望从网站A的用户能够在现场B.登录检查通过执行syncdb创建的用户表后,我看不出列这可能会限制用户的特定部位。 我也试图创建一个用户,“鲍勃”,在一个网站上,然后使用shell命令列出的另一边,果然所有的用户,鲍勃显示在那里。

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

Answer 1:

最兼容的方式做,这是创建一个用户配置文件的模型 ,其中包括一个外键的网站模式,然后写一个自定义的身份验证后端 ,检查针对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

这AUTH后端假设所有用户都有一个配置文件; 你需要确保你的用户创建/注册过程中始终将创建一个。

重写的authenticate方法,确保用户只能在正确的网站登录。 该get_user方法被调用在每次请求获取基于用户的会话存储的认证信息数据库的用户; 我们覆盖确保用户无法登录在现场A,然后使用相同的会话cookie来获得未经授权的访问到站点B(感谢扬罗贝尔您指出需要处理后一种情况。)



Answer 2:

您可以将称取该网站的ID考虑自己的授权和认证后端。

见其他认证源 Django文档上的认证后端引用

除此之外,如果你的Django源太旧了,你可以随时修改的身份验证()或登录()代码自己。 毕竟......是不是开源的奇迹的那一个。 要知道,这样做可能会影响与其他模块的兼容性。

希望这可以帮助。



Answer 3:

你要知道,很多人抱怨Django的默认授权制度和特权 - 它为对象只是规则,为对象的实例 - 这意味着什么,这无需编写任何代码就woudn't是可能的。

然而,也有一些授权挂钩这可以帮助你实现这一目标,例如:

看看有: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py和类权限。

您可以添加自己的权限,并为它们定义的规则(有用户和ContentType的一个ForeignKey)。

However2,没有的Monkeypatching /改变一些方法,可能很难。



文章来源: How to get unique users across multiple Django sites powered by the “sites” framework?