欢迎访问宙启技术站
智能推送

怎么设置和验证Django权限

发布时间:2023-05-18 20:00:39

Django 提供非常完善的权限系统来处理用户访问控制的问题。通过权限系统,我们可以对用户的访问进行精细控制,确保只有被授权的人可以执行某些操作。在 Django 中,权限是基于模型的,而且默认情况下, Django 会为每个模型(model)自动生成一些基本权限。

我们可以通过如下步骤来设置和验证 Django 的权限:

1. 安装 Django

在安装 Django 之前,你先需要安装 Python。可以访问 python 官网下载并安装 Python。Windows 下安装好之后,打开命令行,并输入以下命令安装 Django:

pip install django

2. 创建 Django 项目

在 Django 安装完成之后,我们可以创建一个 Django 项目。假设我们已经进入到项目需要保存的目录,现在我们想要创建一个名为 myproject 的项目。我们可以在命令行下,输入以下命令来创建项目:

django-admin startproject myproject

3. 创建 Django App

App 是 Django 项目的一个组成部分, 我们可以通过创建 app 来管理访问权限。我们可以使用以下命令在项目中创建 app。

python manage.py startapp myapp

4. 创建模型 Model

下面我们来创建一些模型,并添加一些权限。在 models.py 文件中添加如下代码:

from django.db import models
from django.contrib.auth.models import User, Group

class Post(models.Model):
        title = models.CharField(max_length=128)
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        content = models.TextField()

        class Meta:
            permissions = [
                 ("can_publish", "Can publish the Post"),
                 ("can_delete", "Can delete the Post"),
            ]

在上述代码中,我们声明了一个名为 Post 的模型,拥有三个属性:title, author 和 content。此外,我们还使用了 permissions 属性来添加两个自定义的权限:can_publish 和can_delete 。

5. 收集可用的权限

现在,我们需要执行以下命令来更新我们的数据库,以便该模型的权限被保存:

python manage.py makemigrations myapp
python manage.py migrate

完成这些步骤后,我们可以在 django_admin 的页面上查看我们的两个自定义权限。登录 admin 页面,点击 Post 后面的 add,如下图所示:

![image](https://user-images.githubusercontent.com/52969503/133324950-35c26b57-3f66-4b62-9a87-9ec639da06a3.png)

接着点击 save,并返回到 Post 列表页面,如下图所示:

![image](https://user-images.githubusercontent.com/52969503/133325185-b6a1f256-078c-4695-ab56-6d41b13df310.png)

通过这些步骤,我们在 Django 管理后台的权限页面中看到了表示可以发布和删除帖子的两个自定义权限。

6. 验证权限

我们可以通过获取用户的权限,来确定用户是否有操作 Post 的权限。使用以下 Python 代码可以检查当前登录用户是否有删除文章的权限:

    from django.contrib.auth.decorators import login_required, permission_required
    from django.shortcuts import render, redirect, get_object_or_404
    from .models import Post

    @login_required
    @permission_required('myapp.can_delete', raise_exception=True)
    def delete_post(request, post_id):
        post = get_object_or_404(Post, id=post_id)
        post.delete()
        return redirect('post_list')

在以上代码中,我们使用了 Django 权限系统提供的 @permission_required 装饰器,以确保用户只能删除帖子,只要他们有 myapp.can_delete 允许许可的权限。

7. 权限组

我们知道,用户可以单独授权,也可以将用户分组在同一组中,并将权限分配给该组。我们可以使用 django.contrib.auth.models.Group 类来创建用户组。我们将创建一个名为“Moderators”的组:

    from django.contrib.auth.models import Group, Permission

    moderators = Group.objects.create(name='Moderators')

    # 将“Can delete post”权限赋予Moderators组
    delete_permission = Permission.objects.get(codename='can_delete')
    moderators.permissions.add(delete_permission)

    # 查看Moderators组是否有can_delete权限
    print(moderators.permissions.all())

在这些代码中,我们创建了一个名为“Moderators”的用户组。此外,我们还将“Can delete Post”权限添加到该组。

总结:

Django 的权限系统是基于模型的,即在模型定义中可以添加 permissions 属性来定义模型所支持的权限。我们可以通过在用户验证函数上使用 @permission_required 装饰器来确保用户有足够的权限执行特定操作。我们也可以使用 django.contrib.auth.models.Group 类来创建用户组,并使用 add() 方法为该组添加权限。