27 Django 用户认证与权限之权限控制

在上一篇文章中,我们探讨了如何实现用户登录功能。在这篇文章中,我们将深入了解如何在 Django 中进行权限控制,以确保只有被授权的用户才能访问特定的资源或功能。

理解Django的权限系统

Django 内置了一个强大的权限系统,每个 User 模型实例都可以拥有一组权限。Django 的权限可以分为三类:

  1. 基本权限:包括 添加修改删除 等权限。
  2. 自定义权限:可以为自己的模型自定义权限。
  3. :通过组来批量管理一组用户的权限。

设置权限

在 Django 中,你可以通过模型的 Meta 类来定义自定义权限。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
from django.db import models

class MyModel(models.Model):
name = models.CharField(max_length=100)

class Meta:
permissions = [
("can_publish", "Can publish the model"),
("can_archive", "Can archive the model"),
]

在上面的代码中,我们为 MyModel 定义了两个自定义权限:can_publishcan_archive

分配权限

用户和组可以通过 Django 的管理后台或者通过代码来分配权限。下面的示例展示了如何在代码中给用户分配权限:

1
2
3
4
5
6
7
8
9
from django.contrib.auth.models import User, Permission
from myapp.models import MyModel

# 获取用户和权限
user = User.objects.get(username='myuser')
permission = Permission.objects.get(codename='can_publish')

# 将权限赋予用户
user.user_permissions.add(permission)

在这个示例中,我们首先获取了一个用户实例和一个自定义权限实例,然后将权限通过 user_permissions 字段赋予用户。

进行权限检查

Django 提供了一些简单的方法来检查一个用户是否具有特定权限。在视图中,你可以使用 request.user.has_perm() 方法来检查用户的权限。以下是一个视图示例:

1
2
3
4
5
6
7
8
9
from django.http import HttpResponseForbidden
from django.shortcuts import render

def publish_view(request):
if not request.user.has_perm('myapp.can_publish'):
return HttpResponseForbidden("You do not have permission to publish.")

# 如果用户有权限,执行发布操作
return render(request, 'publish.html')

在这个 publish_view 视图中,我们检查当前用户是否有 can_publish 权限。如果没有,返回 403 Forbidden 响应。

使用装饰器

Django 还提供了一些装饰器来简化权限检查,例如 @permission_required 装饰器。在视图上使用该装饰器,可以直接限制访问权限。

1
2
3
4
5
6
7
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render

@permission_required('myapp.can_publish', raise_exception=True)
def publish_view(request):
# 用户有权限,可以访问该视图
return render(request, 'publish.html')

在这个示例中,我们使用 @permission_required 装饰器来确保只有具有 can_publish 权限的用户才能访问 publish_view

使用 Django 的内置组管理权限

Django 允许将用户分组,并为组分配权限。您可以在管理后台创建组,并在组上赋予权限。然后,您只需将用户添加到组中,即可为其授予组的所有权限。

1
2
3
4
5
6
7
8
9
from django.contrib.auth.models import Group

# 创建一个组并添加权限
group, created = Group.objects.get_or_create(name='Publishers')
permission = Permission.objects.get(codename='can_publish')
group.permissions.add(permission)

# 将用户添加到组
user.groups.add(group)

总结

在本篇文章中,我们学习了如何在 Django 中进行权限控制,包括定义、分配权限、进行权限检查以及使用组管理权限。这些功能都是确保您应用程序安全和可控的关键部分。

在下一篇文章中,我们将介绍如何使用 Django 的管理后台来管理模型和权限。敬请期待!

27 Django 用户认证与权限之权限控制

https://zglg.work/django-zero/27/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论