我已经为Django 1.2+找到了3个行级权限解决方案:
请问有没有推荐的解决方案?它们之间的主要区别是什么?
首先声明,我们不使用这些工具进行对象级别的权限控制 - 我们使用自定义方法,但真心希望没有这个需求。如果你能够避免使用对象级别的权限控制,请这样做,因为它们很难组织。
以下是我对提到的三个应用程序的评估。
活跃度:
API
顺便说一下,以上排名有先后之分。
纯粹从 API 的角度推荐 guardian,而且它仍在开发中,这通常意味着一个重大的胜利。
截至'13年8月,django-object-permissions已被django-permission取代。这三个项目正在积极开发中。
就我个人而言,我更喜欢使用权限或许可性,它使用方法检查权限(运行时),而不是django-guardian使用数据库来保留权限(例如在对象创建时附加)。
-- 编辑 --
文档中的示例。
joe = User.objects.create(username='joe')
task = Task.objects.create(summary='Some job', content='', reported_by=boss)
joe.has_perm('view_task', task)
>> False
assign_perm('view_task', joe, task)
joe.has_perm('view_task', task)
>> True
您分配权限并将其保存在数据库中。
声明:
class FlatpagePermission(permissions.BasePermission):
label = 'flatpage_permission'
checks = ('morning_flatpage_check',)
def morning_flatpage_check(self, flatpage):
hour = int(datetime.datetime.now().strftime("%H"))
if hour >= 8 and hour <= 12 and flatpage.url == '/about/':
return True
return False
authority.register(Flatpage, FlatpagePermission)
使用方法:
def my_view(request):
check = FlatPagePermission(request.user)
flatpage_object = Flatpage.objects.get(url='/homepage/')
if check.morning_flatpage_check(flatpage=flatpage_object):
print "Yay, you can change *this* flatpage!"
它还包装了标准的 Django 权限,但您可以在上面的自定义权限中看到其灵活性,-AFAIK- 在 Guardian 中无法实现。
一个学生可以属于一个或多个教室。
Guardian:
'attend_classroom'
权限附加到学生的教室对象上。'attend_classroom'
权限从学生的教室对象上删除。'attend_classroom'
权限。Authority:
ClassroomPermission.can_attend_classroom()
,该权限将查询学生是否属于教室。ClassroomPermission.can_attend_classroom()
。Authority 将检查逻辑保留在独立的文件中。Guardian 需要通过其余代码进行权限的附加/移除。
user.has_perm('classroom.attend_classroom')
? - Rob Grant