仅限网站的权限

时间:2009-10-20 09:24:27

标签: python django permissions

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

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

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

做那样的事情的干净方法是什么?

编辑:这是我改编的解决方案,由Chris提供

我创建了一个装饰器,用于检查用户是否在有权访问lang的组中。 有关此示例,请参阅克里斯接受的答案。

在“普通”视图中,我执行以下操作:

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_required是与上面提到的group_required类似的方法。但是,根据我们是否有访问权限,只会返回true或false。

因为我们在前面的例子中使用了它们,所以你可以在上面找到我在in_group和group_required方法中的内容。

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 个答案:

答案 0 :(得分:3)

您可以创建一个组(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

(纠正/修改代码以符合您的要求......)

答案 1 :(得分:1)

您可以在ModelAdmin类中覆盖has_add_permission(和相关方法)。 (使用类似的代码如上所示)

答案 2 :(得分:0)

如果要过滤页面应用程序的管理索引上的Page对象, 您可以在ModelAdmin中覆盖方法queryset()。 此QuerySet仅返回属于站点(因此为组)的Page对象 其中request.user是其成员。

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