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

本文共 3164 字,大约阅读时间需要 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 Article
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_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 User
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
def 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/

你可能感兴趣的文章
nginx 代理解决跨域
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>
Nginx 结合 consul 实现动态负载均衡
查看>>