栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django Admin

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django Admin

首先,警告:Django admin的设计理念是,有权访问admin(

is_staff==True
)的任何用户都是受信任的用户,例如员工,因此,“ staff”名称甚至可以访问admin。尽管你可以自定义管理员以限制区域,但允许组织内任何人访问你的管理员都是有风险的,并且Django在那时不保证任何安全性。

现在,如果你仍要继续操作,则可以通过简单地不将这些特权分配给用户来立即限制除了商店之外的大多数其他东西。你必须授予所有商店所有者权限,以编辑他们需要访问的任何商店模型,但其他所有内容都应保留在其权限列表之外。

然后,对于每个仅需限制所有者注意的模型,你将需要添加一个字段来存储“所有者”,或者用户允许对其进行访问。你可以使用上的

save_model
方法执行此操作,该方法ModelAdmin可以访问请求对象:

class MyModelAdmin(admin.ModelAdmin):    def save_model(self, request, obj, form, change):        obj.user = request.user        super(MyModelAdmin, self).save_model(request, obj, form, change)

然后,你还需要将ModelAdmin的queryset限制为仅由当前用户拥有的那些项:

class MyModelAdmin(admin.ModelAdmin):    def get_queryset(self, request):        qs = super(MyModelAdmin, self).get_queryset(request)        if request.user.is_superuser: return qs        return qs.filter(owner=request.user)

但是,这只会限制列出的内容,用户仍然可以使用URL来访问他们无权访问的其他对象,因此,如果用户不是,则需要覆盖每个ModelAdmin的易受攻击的视图以进行重定向。主人:

from django.http import HttpResponseRedirectfrom django.core.urlresolvers import reverseclass MyModelAdmin(admin.ModelAdmin):    def change_view(self, request, object_id, form_url='', extra_context=None):        if not self.queryset(request).filter(id=object_id).exists(): return HttpResponseRedirect(reverse('admin:myapp_mymodel_changelist'))        return super(MyModelAdmin, self).change_view(request, object_id, form_url, extra_context)    def delete_view(self, request, object_id, extra_context=None):        if not self.queryset(request).filter(id=object_id).exists(): return HttpResponseRedirect(reverse('admin:myapp_mymodel_changelist'))        return super(MyModelAdmin, self).delete_view(request, object_id, extra_context)    def history_view(self, request, object_id, extra_context=None):        if not self.queryset(request).filter(id=object_id).exists(): return HttpResponseRedirect(reverse('admin:myapp_mymodel_changelist'))        return super(MyModelAdmin, self).history_view(request, object_id, extra_context)

由于的查询集

ModelAdmin
已经受到用户的限制,因此你只能
self.queryset()
在更改,删除和历史视图中使用。这样可以很好地抽象出模型类名,从而减少代码的脆弱性。我还更改为使用
filter
exists
而不是
try...except
使用
get
。这样更简化了,实际上也导致了更简单的查询。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373929.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号