代码之家  ›  专栏  ›  技术社区  ›  Damien MATHIEU

仅对网站的权限

  •  3
  • Damien MATHIEU  · 技术社区  · 15 年前

    我有一个多语种的Django项目。每种语言都是不同的子域。 所以我们决定使用“站点”应用程序,为每种语言创建一个不同的站点。

    在那个项目中,我还有一个“页面”应用程序,它非常类似于CMS。用户可以创建包含内容的页面,这些页面将显示在相应的语言站点中。

    现在我希望能够管理高级权限。我需要做的是,在管理应用程序中,允许用户仅为一个(或多个)特定语言/站点创建和更新页面。

    有什么更干净的方法可以做这样的事情?

    编辑:这是克里斯给我的解决方案

    我创建了一个装饰器,它检查用户是否在有权访问lang的组中。 请参阅Chris的“接受答案”作为例子。

    在“正常”视图中,我执行以下操作:

    def view(self):
        # Whatever you wanna do
        return render_to_response('page.html', {}, RequestContext(request))
    view = group_required(view)
    

    如果用户在组中,它将返回方法。否则,它将返回“拒绝访问”错误。

    在我的管理中,我会做以下工作:

    class PageAdmin(admin.ModelAdmin):
        list_display = ('title', 'published')    
        fieldsets = [
            (None, {'fields': ['title', 'slug', 'whatever_field_you_have']}),
        ]
    
        def has_add_permission(self, request):
            return in_group_required(request)
    admin.site.register(Page, PageAdmin)
    

    其中,所需的In-Group_是与上述所需的Group_类似的方法。但根据我们是否有访问权限,只返回正确或错误。

    因为我们在前面的例子中经常使用它们,所以您可以在上面找到我在in_组和group_所需方法中的内容。

    def group_required(func):
        def _decorator(request, *args, **kwargs):
            if not in_group(request):
                return HttpResponse("Access denied")
            return func(*args, **kwargs)
        return _decorator
    
    def in_group(request):
        language = Language.objects.get(site__domain__exact=request.get_host())
        for group in language.group.all():
            if request.user in group.user_set.all():
                return True
        return False
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   Chris    15 年前

    你可以创建一个组( http://docs.djangoproject.com/en/dev/topics/auth/ ) 按站点/语言,并相应地将用户添加到组中。

    然后,可以检查request.user.groups是否属于该组。 (您可以使用装饰器:

    def group_required(func):
        def _decorator(request, *args, **kwargs):
            hostname = request.META.get('HTTP_HOST')
            lang = hostname.split(".")[0]
            if not lang in request.user.groups:
                return HttpResponse("Access denied")
            return func(*args, **kwargs)
        return _decorator
    

    (更正/修改代码以符合您的要求…)

        2
  •  1
  •   Chris    15 年前

    您可以重写ModelAdmin类中的“添加”权限(和相关方法)。 (类似代码如上图所示)

        3
  •  0
  •   Chris    15 年前

    如果要筛选页面应用程序的管理索引上的页面对象, 您可以在ModelAdmin中重写方法queryset()。 此查询集仅返回属于某个站点(因此是组)的页面对象。 其中request.user是成员。

    Pages.objects.filter(site__name__in=request.user.groups)