博客
关于我
Django基础(23): 权限管理(permissions)与用户组(group)详解
阅读量:234 次
发布时间:2019-02-28

本文共 3122 字,大约阅读时间需要 10 分钟。

Django 权限管理详解

1. 什么是权限?

权限是控制用户行为和显示内容的机制。一个完整的权限应包含三个要素:用户对象权限。即,某个用户对某个对象拥有什么样的权限。

以我们的博客应用为例,假设有一个 Article 模型。超级用户通常有以下四种权限,而普通用户可能只有部分权限,比如只能查看文章或创建、查看、编辑但不能删除。

2. Django Admin 中的权限分配

在 Django 的 Admin界面中,可以轻松分配用户权限。当编辑用户信息时,可以在“用户权限”栏中为用户设置对某些模型的查看、增加、修改和删除权限。

Django 的权限机制基于 auth 应用中的 Permission 模型,与 User 模型通过 user_permissions 字段建立多对多关系。安装 auth 应用后,Django 会为每个应用自动创建四种权限:viewaddchangedelete。随后,可以通过 Admin界面分配这些权限给不同用户。

3. 查看用户权限

权限名通常由应用标签(app_label)、权限动作和模型名组成。以 blog 应用为例,Article 模型的四种默认权限为:

  • viewblog.view_article
  • addblog.add_article
  • changeblog.change_article
  • deleteblog.delete_article

可以使用 user.has_perm() 方法判断用户是否拥有特定权限。例如:

user_A.has_perm('blog.add_article')  # 返回 True

要查看用户的所有权限(包括从用户组获得的权限),可以使用 get_group_permissions()get_all_permissions() 方法。

4. 手动定义和分配权限

有时,Django 的默认权限无法满足需求。可以通过以下方法手动定义权限。

方法 1:在模型的元类中添加权限
class Article(models.Model):    class Meta:        permissions = (            ('publish_article', 'Can publish article'),            ('comment_article', 'Can comment article'),        )
方法 2:使用 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会多出两个权限选项。手动分配权限可通过以下方式实现。

5. 手动分配权限

  • 方法 1:使用 user.user_permissions.add() 方法
myuser.user_permissions.add(permission1, permission2, ...)
  • 方法 2:通过用户组分配权限
mygroup.permissions.add(permission1, permission2, ...)

要移除权限,可使用 remove()clear() 方法:

myuser.user_permissions.remove(permission, permission, ...)myuser.user_permissions.clear()

6. 权限缓存机制

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

7. 用户组(Group)

用户组与 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()

8. Django 权限机制的不足

Django 的权限机制是基于模型的,适用于控制对完整对象的权限。要实现对单个对象的权限管理,需使用第三方库如 Django Guardian。

9. 结论

Django 的权限管理系统功能强大,适合管理用户对模型的整体权限。通过合理配置和分配,可以为不同用户和用户组设置相应的权限。

转载地址:http://bstp.baihongyu.com/

你可能感兴趣的文章
Node读取并输出txt文件内容
查看>>
node防xss攻击插件
查看>>
noi 1996 登山
查看>>
noi 7827 质数的和与积
查看>>
NOI-1.3-11-计算浮点数相除的余数
查看>>
NOI2010 海拔(平面图最大流)
查看>>
NOIp2005 过河
查看>>
NOIP2011T1 数字反转
查看>>
NOIP2014 提高组 Day2——寻找道路
查看>>
noip借教室 题解
查看>>
NOIP模拟测试19
查看>>
NOIp模拟赛二十九
查看>>
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>
NoNodeAvailableException None of the configured nodes are available异常
查看>>
Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
查看>>