本文共 3122 字,大约阅读时间需要 10 分钟。
权限是控制用户行为和显示内容的机制。一个完整的权限应包含三个要素:用户、对象和权限。即,某个用户对某个对象拥有什么样的权限。
以我们的博客应用为例,假设有一个 Article 模型。超级用户通常有以下四种权限,而普通用户可能只有部分权限,比如只能查看文章或创建、查看、编辑但不能删除。
在 Django 的 Admin界面中,可以轻松分配用户权限。当编辑用户信息时,可以在“用户权限”栏中为用户设置对某些模型的查看、增加、修改和删除权限。
Django 的权限机制基于 auth 应用中的 Permission 模型,与 User 模型通过 user_permissions 字段建立多对多关系。安装 auth 应用后,Django 会为每个应用自动创建四种权限:view、add、change 和 delete。随后,可以通过 Admin界面分配这些权限给不同用户。
权限名通常由应用标签(app_label)、权限动作和模型名组成。以 blog 应用为例,Article 模型的四种默认权限为:
view:blog.view_articleadd:blog.add_articlechange:blog.change_articledelete:blog.delete_article可以使用 user.has_perm() 方法判断用户是否拥有特定权限。例如:
user_A.has_perm('blog.add_article') # 返回 True 要查看用户的所有权限(包括从用户组获得的权限),可以使用 get_group_permissions() 和 get_all_permissions() 方法。
有时,Django 的默认权限无法满足需求。可以通过以下方法手动定义权限。
class Article(models.Model): class Meta: permissions = ( ('publish_article', 'Can publish article'), ('comment_article', 'Can comment article'), ) ContentType 程序化创建权限from blog.models import Articlefrom django.contrib.auth.models import Permissionfrom django.contrib.contenttypes.models import ContentTypecontent_type = ContentType.objects.get_for_model(Article)permission1 = Permission.objects.create( codename='publish_article', name='Can publish articles', content_type=content_type,)permission2 = Permission.objects.create( codename='comment_article', name='Can comment articles', content_type=content_type,)
安装迁移后,Django Admin会多出两个权限选项。手动分配权限可通过以下方式实现。
user.user_permissions.add() 方法myuser.user_permissions.add(permission1, permission2, ...)
mygroup.permissions.add(permission1, permission2, ...)
要移除权限,可使用 remove() 或 clear() 方法:
myuser.user_permissions.remove(permission, permission, ...)myuser.user_permissions.clear()
Django 会缓存每个用户的权限。当手动更改用户权限后,需重新获取用户对象以获取最新权限。
from django.contrib.auth.models import Userfrom django.contrib.contenttypes.models import ContentTypefrom django.shortcuts import get_object_or_404def user_gains_perms(request, user_id): user = get_object_or_404(User, pk=user_id) # 权限已缓存 user.has_perm('myapp.change_blogpost') # False # 更新权限 content_type = ContentType.objects.get_for_model(BlogPost) permission = Permission.objects.get( codename='change_blogpost', content_type=content_type, ) user.user_permissions.add(permission) # 权限未更新 user.has_perm('myapp.change_blogpost') # False # 刷新用户对象 user = get_object_or_404(User, pk=user_id) # 权限已更新 user.has_perm('myapp.change_blogpost') # True 用户组与 User 模型建立多对多关系,用于批量管理权限。将用户添加到用户组后,用户获得组内所有权限。
通过 Django Admin 添加或移除权限:
mygroup.permissions = [permission_list]mygroup.permissions.add(permission, permission, ...)mygroup.permissions.remove(permission, permission, ...)mygroup.permissions.clear()
将用户移除用户组:
myuser.groups.remove(group, group, ...)myuser.groups.clear()
Django 的权限机制是基于模型的,适用于控制对完整对象的权限。要实现对单个对象的权限管理,需使用第三方库如 Django Guardian。
Django 的权限管理系统功能强大,适合管理用户对模型的整体权限。通过合理配置和分配,可以为不同用户和用户组设置相应的权限。
转载地址:http://bstp.baihongyu.com/