Django 用户验证与权限管理详解

news2024/11/24 23:18:26


概要

Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探究一下Django如何处理用户验证和权限管理的。


用户验证

Django自带的User模型及伴随的Django框架对于只需要基本的访问授权和用户验证需求的应用来说已经足够了。下面,就让我们来实现一个用户登录的功能。

创建视图

在视图中,我们主要使用Django提供的authenticate()login()函数。

from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']       # 获取用户名
        password = request.POST['password']       # 获取密码
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('/home/')
        else:
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    else:
        return render(request, 'login.html')

此处,authenticate()函数会在给定的用户名和密码有效时返回一个User对象。如果用户名或密码无效,则authenticate()返回None。

权限管理

在进行权限管理时,Django提供了三种级别的权限控制:模型级别、对象级别和视图级别。

模型级别

模型级别的权限主要是针对整个模型的增、删、查、改进行设置。

class Meta:
    permissions = [
        ("view_project", "Can see available project"),
        ("add_project", "Can add project"),
        ("change_project", "Can edit project"),
        ("delete_project", "Can delete project"),
    ]

你可以在项目的模型中如上所示定义权限。

对象级别

对象级别的权限管理允许你在单个对象(例如数据库中的一条记录)上设置权限,这对于实现更细粒度的权限控制非常有用。Django本身不直接支持对象级别权限,但可以通过第三方库如django-guardian来实现。

例如,使用 django-guardian,你可以为单个用户或用户组指定特定对象的权限:

from guardian.shortcuts import assign_perm

# 给用户分配某个特定项目的查看权限
assign_perm('view_project', user, project_instance)

在视图中,你可以检查用户是否拥有特定对象的权限:

from guardian.shortcuts import get_objects_for_user

def my_view(request):
    # 获取用户可以查看的所有项目
    projects = get_objects_for_user(request.user, 'app.view_project')
    ...

视图级别

视图级别的权限管理是通过限制对特定视图的访问来实现的。Django提供了多种方式来控制对视图的访问,包括使用装饰器、混入类和中间件。

使用装饰器

@login_required 和 @permission_required 是两个常用的视图级权限管理装饰器。例如:

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('app.view_project', raise_exception=True)
def project_detail(request, project_id):
    ...

这里,login_required 确保用户必须登录,而 permission_required 确保用户具有特定权限。

使用混入类

在基于类的视图(CBV)中,你可以使用混入类来控制权限。例如,使用 LoginRequiredMixin 和 PermissionRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import DetailView

class ProjectDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
    ...
    permission_required = 'app.view_project'

总结

以上就是Django在用户验证和权限管理上的一些基本实践。实际上,Django还提供了更为强大和灵活的功能,例如Django自带的User模型可以根据需求进行扩展,例如添加新的字段;还可以自定义用户模型,完全替代Django的User模型,以便更好地满足复杂的业务需求。另外,Django还提供了权限控制的中间件,让用户可以在视图处理请求之前进行权限的校验,进一步加强了权限管理的灵活性和安全性。这也都正是我们选择和喜爱Django的原因之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、Linux基础软件安装

目录 1、安装JDK 2、安装Mysql 接下来,我们来学习如何在linux上安装JDK和Mysql,安装之前需要在Linux上提前创建三个目录: mkdir -p /export/software #软件包存放目录 mkdir -p /export/server #安装目录 mkdir -p /export/data #数据存放目录…

【Windows】解决Windows11错误0x80190001

1. 安装Fiddler网络调试工具 下载链接:Fiddler Classic 注:获取安装包的过程中可能要获取邮箱信息,但不用验证邮箱,大概是给你的邮箱发广告信息,问题不大。 在“开始”界面找到Fiddler Classic,点击运行…

封装flutter webview页面

例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class MyWebView extends StatefulWidget {const MyWebView({super.key, required this.webViewUrl,…

入门Python+Vue 全栈开发可视化BI数据项目几个要点总结

随着数据的快速增长和业务的复杂性,越来越多的企业开始关注数据分析和可视化。在本文中,我们将介绍如何使用Python和Vue进行全栈开发,构建一个可视化BI数据项目,并总结几个关键要点。 首先,Python是一种强大而灵活的编…

【JAVA面向对象编程】--- 探索子类如何继承父类

🌈个人主页: Aileen_0v0🔥学习专栏: Java学习系列专栏 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 继承的普通成员方法调用 及 普通成员变量修改 构造方法的调用 子类构造方法 继承 package Inherit;class Animal …

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件,它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同,可以将企业软件分为以下几类。 1. 企业资源计划(ERP&#xff09…

rest_framework_django 学习笔记二(视图路由)

rest_framework_django 学习笔记二(视图路由) rest_framwork_django学习笔记一(序列化器) 一、rest framework 中Request 与 Response 1、Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,二是REST Fame…

git解决冲突

记录一次 git 解决冲突的过程。 情况是前一段时间我基于本地的 master 分支上新建了一个分支比如叫做 weight_linear: git checkout -b weight_linear 然后我已经在这个分支上进行了修改并上传到 github 上了,比如: git add . git commit -m "u…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中,我们学习了fork()函数用来创建子进程。 子进程是父进程的副本,复制父进程除代码段以外的其他数据,代码段数据和父进程共享。 子进程的PID与父进程不同: 而创建新进程则不同。 与fork()不同…

传统算法: Pygame 实现深度优先搜索(DFS)

使用 Pygame 模块实现了深度优先搜索(DFS)的动画演示。首先,它通过邻接矩阵表示了一个图的结构,其中每个节点表示一个字符,每个字符的邻居表示与之相邻的节点。然后,通过深度优先搜索算法递归地访问所有节点,过程中通过动画效果可视化每一步的变化。每次访问一个节点,该…

数据爬虫(JSON格式)数据地图可视化(pyecharts)【步骤清晰,一看就懂】

一、前言 数据存储在网页上,需要爬取数据下来,数据存储格式是JSON,数据可视化在工作中也变得日益重要,接下来将数据爬虫与数据可视化结合起来,做个案例 注:当时数据是22年1月29日爬取数据 二、使用步骤 …

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题,首先要简单说下芯片的大小端问题,这里主要讨论Cortex-M内核。 M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固…

TR转发路由器测评—云企业网实现跨地域跨VPC的网络互通测评实战【阿里云产品测评】

文章目录 一.转发路由器 Transit Router 测评1.1 准备阶段1.2 本文测评收获1.3 什么是云企业网实例、转发路由器实例和云数据传输服务 二.使用云企业网实现跨地域跨VPC的网络互通2.2 **测试连通性**2.3 网络拓扑如下: 心得:总结: 声明&#x…

Vue+SpringBoot解决session跨域问题

做了一个前后端分离,因为前后端的 session id不一致,导致前端请求时,后端的session读取不到对应的值,造成登录问题。 解决方法: SpringBoot项目: 添加一个跨域配置 代码如下: 或者controller使用CrossOrigin Conf…

解决noauth authentication required异常

今天在使用redis数据库的时候,突然给报了个这个错误,上网一查才知道是因为 Redis 服务器需要密码进行身份验证,因此,我们需要通过auth password 进行身份验证。不过我这个密码还是试了很多次才想起来的,哦好像是听网课…

WSL2 docker GUI 界面

在 WSL2 docker 中运行GUI界面。 具体流程和远程显示Ubuntu界面类似,链接, 更简单一点, 少了 ssh 的部分。 安装好wsl2 和 docker wsl2 运行GUI程序,windows 会默认弹出窗口。 可以安装 gedit 测试一下 windows 下载并运行 Xlaunch. 运行 d…

【驱动】SPI驱动分析(二)-SPI驱动框架

SPI驱动框架 SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线。总体框架如下图所示: 从上到下,分为三层,用户空间,内核空间,和硬件…

微信小程序真机调试的时候出现白屏解决办法

我使用uniapp开发微信小程序开发,使用真机调试的时候,出现白屏,页面里面啥都没有,也没有报错,这就让人很纳闷了: 解决办法: 打开真机调试,下面有:切换真机调试1.0&#…

RocketMQ-RocketMQ快速实战及集群原理

一、MQ简介 ​ MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。 这个词可以分两个部分来看,一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布…

虚拟机系列:Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置

Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 在更新Oracle VM Virtua…