我们有一个系统,按照您的要求运行。程序具有基本的用户登录功能,是基本站点,使用手写视图和模板(因为需要)。存在一个客户部分,这是带有有限访问权限的基本管理页面。还有超级管理员,就像我和像我一样的人。
逻辑是,管理员是公司中工作的人,他们可能拥有所有访问权限(正如sjango所说的超级用户),或者对应用程序有有限的访问权限,但可以查看与他们所拥有的访问权限相关的所有相关数据库记录。客户是我们销售我们的程序的人,他们对管理员有限的访问权限,并且只能查看与他们相关的记录。用户是我们客户的客户...
在这一点上,Django权限不足,因为我们的客户必须看到属于他的帐户的记录,而标准管理员可以查看所有记录。这两个用户可以根据其权限访问应用程序。超级用户可以看到和做任何事情...
为了解决这个问题,我们没有使用Django网站应用程序(我从未使用过并且没有太多信息),而是创建了一个扩展Django用户的模型,该模型具有类似于角色的字段。如果用户角色是系统管理员,则可以查看所有内容(如果是超级用户,则使用正常的权限)。否则,他只能访问与他们的网站相关的记录(在您的情况下是公司)。
因此,几乎每个数据库表都必须有一个外键,定义了相关记录的所有者公司。
通过这样做,如果需要,您可以过滤属于特定公司的记录...
在我的模型中,我有继承用户模型的Kullanici。
class Kullanici(User):
rol = SmallIntegerField()
然后,我编写了几种方法来覆盖管理员方法,例如; ModelAdmin.save和ModelAdmin.queryset,进行以下检查...
def override_queryset(obj, req):
qs = super(type(obj), obj).queryset(req)
kullanici = Kullanici.objects.get(id=req.user.id)
if kullanici.rol == 10:
return qs
return qs.filter(site=kullanici.site)
当用户进入应用程序的列表视图时,他只会看到与他相关的站点,其他记录将不会显示,或者如果他试图访问属于其他站点的记录,他将收到权限错误。这些都是基于Django的控件,因此您可以确信它们不会访问到不应访问的任何记录。
您必须覆盖所有需要过滤客户所属信息的管理方法。
为了进一步限制,我使用了一个函数来显示/隐藏模型的字段。在admin.py文件中:
class SomeModelAdmin(ModelAdmin):
exclude= []
def changelist_view(self, request, extra_context=None):
extra_context = {'exclude':['field1','field2']}
return get_admin_listview(self, request, extra_context)
def get_admin_listview(obj, req, extra):
system_admin = Kullanici.objects.get(id=req.user.id).rol == 1
if not system_admin:
if 'exclude' in extra.keys():
for key in extra['exclude']:
if key not in obj.exclude:
obj.exclude.add(key)
如果您提供一个要隐藏的字段名称列表,它将在用户不是系统管理员的情况下隐藏这些字段...
缺点是,Django管理界面的缓存可能会导致问题,我在8个月内遇到过一两次。另一个重要的部分是,您无法限制管理筛选器,因此如果您有一个需要有限访问权限的筛选器,您无法过滤筛选器键。您可以使用所有选项显示它,或者干脆不使用它。
如果这种方法解决了您的问题,我可以编写更详细的信息...
更新:是的,权限系统很简单且安全,如果您检查来自最新主干代码的permission_required装饰器的源代码, ...
逻辑很简单,如果用户具有相关权限,则执行相关视图。否则,相关视图或代码根本不会执行。因此,权限为Django管理提供了足够的安全性。 权限控制可以在视图级别和/或模板级别使用。
必须小心的一个问题是手写视图,其中不安全的代码可能会导致严重问题,但这完全取决于您的编码,这是您将在每个框架和编程语言上面临的安全风险...
问题的最后一点是Django和管理视图页面的过滤机制。由于几乎所有管理筛选器都使用GET来过滤数据,并将ID传递给URL以显示特定记录。 Django书的安全部分显示了可能的安全问题的基本信息以及Django如何处理它们...另一方面,2010年12月22日的安全更新显示了一个如此重要的漏洞,需要有关模型结构的足够信息。