django-Vue搭建博客:用户权限

权限是 web 应用的重要组成部分。没有权限控制,任何人的请求都会对数据资源进行操控,那就乱套了。

本章就来学习 drf 中如何进行权限管理。

教程来源杜塞-django-vue系列
博客链接 传送门

文章与用户

依靠用户身份来限制权限是比较通用的做法,在静态模式下存在,drf中那也当然存在。
改写文章模型添加用户外键,确定每篇文章的作者,保险起见,我们要提前删除现有的所有文章。

修改文章model,添加以下:

#article/model.py
from django.contrib.auth.models import User

# 博客文章
class Article(models.Model):
	# 用户
    author = models.ForeignKey(
        User,
        null=True,
        on_delete=models.CASCADE,
        related_name='articles'
    )

执行迁移(每次对模型进行修改都需要!!!):

> python manage.py makemigrations
> python manage.py migrate

启动服务器,然后再次请求:

(venv) E:\drf\drf_vue_blog>http http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 2
Content-Type: application/json
Date: Sun, 13 Jun 2021 06:22:02 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.4
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[]

空空如也。

接下来对文章列表接口进行操作.

权限控制

DRF 内置了如IsAuthenticatedIsAdminUserAllowAny等权限控制类。

由于是个人博客,因此只准许管理员发布文章。修改文章列表视图如下:

# article/views.py
from rest_framework.permissions import IsAdminUser


class ArticleList(generics.ListCreateAPIView):
	···
    # 新增
    permission_classes = [IsAdminUser]

permission_classes可以接收一个列表,因此权限控制类可以设置多个,请求必须满足所有控制条件才允许被放行。

测试一下:

(venv) E:\drf\drf_vue_blog>http http://127.0.0.1:8000/api/article/
HTTP/1.1 403 Forbidden
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 58
Content-Type: application/json
Date: Sun, 13 Jun 2021 06:23:43 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.4
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "detail": "Authentication credentials were not provided."
}



(venv) E:\drf\drf_vue_blog>http POST http://127.0.0.1:8000/api/article/ title=may body=not..
HTTP/1.1 403 Forbidden
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 58
Content-Type: application/json
Date: Sun, 13 Jun 2021 06:24:11 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.4
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "detail": "Authentication credentials were not provided."
}

可以发现确实起作用了,但是除了管理员之外其他人也无法查看,显然这不是我们最重要的结果。

接下来让我们重写。新建 article/permissions.py:

from rest_framework import permissions


class IsAdminUserOrReadOnly(permissions.BasePermission):
    """
    定义我们需要的权限
        1.进管理员可以进行修改
        2.其他用户仅能查看
    """

    def has_permission(self, request, view):
        # 对所有人允许 GET,HEAD,OPTIONS请求
        if request.method in permissions.SAFE_METHODS:
            return True

        # 仅管理员可进行其他操作
        return request.user.is_superuser

自定义的权限类继承了 BasePermission这个基础的父类,并实现了父类中的钩子方法 def has_permission。此方法在每次请求到来时被唤醒执行,里面简单判断了请求的种类是否安全(即不更改数据的请求),如果安全则直接通过,不安全则只允许管理员用户通过。

再次修改视图:

# article/views.py
from .permissions import IsAdminUserOrReadOnly
permission_classes = [IsAdminUser]
# 改为
permission_classes = [IsAdminUserOrReadOnly]

# ArticleList和ArticleDetail添加

改完后进行测试。

首先测试用户未登录状态:


(venv) E:\drf\drf_vue_blog>http http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 2
Content-Type: application/json
Date: Sun, 13 Jun 2021 06:43:43 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.4
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[]



(venv) E:\drf\drf_vue_blog>http POST http://127.0.0.1:8000/api/article/ title=may body=not..
HTTP/1.1 403 Forbidden
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 58
Content-Type: application/json
Date: Sun, 13 Jun 2021 06:44:51 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.4
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "detail": "Authentication credentials were not provided."
}

我们发现,虽然没有文章返回,但是体现出了权限的作用(添加文章测试也是一样的效果,不做多赘述)。
在后台创建普通用户 Obama(这是基础),用普通用户身份进行请求:

# 普通用户Obama密码admin123456

(venv) E:\drf\drf_vue_blog>http -a Obama:admin123456 http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK 成功
···
[]

(venv) E:\drf\drf_vue_blog>http -a Obama:admin123456 POST http://127.0.0.1:8000/api/article/ title=may body=not..
HTTP/1.1 403 Forbidden 失败
Allow: GET, POST, HEAD, OPTIONS
···
{
    "detail": "您没有执行该操作的权限。"
}

这边中文是因为我更改时区问题,英文为:"detail": "You do not have permission to perform this action.
最后创建超级管理员进行测试,我的为 xianwei

# 管理员在用户 xianwei,密码:admin123456

(venv) E:\drf\drf_vue_blog>http -a xianwei:admin123456 http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK 请求成功
···
[]

(venv) E:\drf\drf_vue_blog>http -a xianwei:admin123456 POST http://127.0.0.1:8000/api/article/ title=may body=not..
HTTP/1.1 201 Created 请求成功
···
{
    "created": "2021-06-13T15:01:15.586622",
    "id": 8,
    "title": "may"
}

最终完成了我们要的效果,任何人可以查看,只有管理员进行新增(CREATE)、更新(PUT)、删除(DELETE)等修改操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个django-vue-admin项目,你可以按照以下步骤进行操作: 1. 首先,创建一个Django项目,并安装所需的依赖。在设置文件中,确保你的TEMPLATES配置中包含了以下内容:'BACKEND': 'django.template.backends.django.DjangoTemplates'。 2. 接下来,配置Django的模板上下文处理器。在设置文件中,确保你的TEMPLATES配置中包含了以下内容:'django.contrib.auth.context_processors.auth'和'django.template.context_processors.request'。 3. 然后,安装django-vue-admin库。你可以使用pip安装它:pip install django-vue-admin。 4. 在你的Django项目中创建一个新的应用程序。你可以使用以下命令创建一个名为"admin"的应用程序:python manage.py startapp admin。 5. 在你的项目设置文件中注册新创建的应用程序。将'app名'admin'添加到你的INSTALLED_APPS配置中。 6. 在admin应用程序的目录中创建一个名为"templates"的文件夹,并在其中创建一个名为"admin"的子文件夹。 7. 在"admin"文件夹中创建一个名为"base.html"的模板文件,该文件将作为你的项目的基础模板。 8. 在"base.html"模板文件中,使用Vue.js编写前端代码,以实现你希望在项目中看到的功能和样式。 9. 在你的admin应用程序的视图中,定义需要的后端逻辑和模型操作。 10. 最后,运行你的Django服务器并访问项目的URL,以查看django-vue-admin项目的效果。 请按照以上步骤进行操作,你就可以成功地搭建一个django-vue-admin项目了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Django+Vue环境搭建](https://blog.csdn.net/WeirdoGiraffe/article/details/124863602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值