我的方法是向模型添加一个方法:
class YourModelWithOwnership(models.model):
...
def user_can_manage_me(self, user):
return user == self.user or user.has_perm('your_app.manage_object')
然后,每当需要权限检查时我都会调用该方法,并根据结果采取一些操作。所以对于一个视图来说
from django.shortcuts import get_object_or_404
...
def view_func(request, item_id):
item = get_object_or_404(YourModelWithOwnership, id=item_id) # or whatever is needed to get the object
if not item.user_can_manage_me(request.user):
# user not allowed to manage
...
else:
...
后来我可能意识到,在每个需要测试的视图中仍然需要编写一些样板代码,因此我会实现一个当用户无法管理对象时抛出的异常......
class CannotManage(Exception):
pass
...并向模型添加另一个方法:
from django.db import models
from django.shortcuts import get_object_or_404
class YourModelWithOwnership(models.model):
...
@classmethod
def get_manageable_object_or_404(cls, user, *args, **kwds):
item = get_object_or_404(cls, *args, **kwds)
if not item.user_can_manage_me(user):
raise CannotManage
return item
然后,在视图函数中,可以使用:
def view_func(request, item_id):
item = YourModelWithOwnership.get_manageable_object_or_404(request.user, id=item_id)
...
当用户不是所有者并且没有适当的权限时,这当然会引发异常。该异常可以在process_exception()
的方法自定义中间件 http://docs.djangoproject.com/en/dev/topics/http/middleware/类,这样对于所有不允许用户弄乱该对象的实例都有一个处理程序。