Django 不到20行代码实现用户认证及权限管理完整功能

这篇具有很好参考价值的文章主要介绍了Django 不到20行代码实现用户认证及权限管理完整功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、用户认证与权限管理 — 绕不过去的需求

几乎所有软件项目都不得不实现的1个功能需求就是:用户认证与权限管理。其基本要求包括:

  • 提供用户登入,登出,密码更改,密码重置等页面。
  • 对页面操作、数据访问的权限控制,包括增删改查。
  • 权限控制基于用户、组、基于页面、基于表。

说起来容易,实现起来却非易事,特别是权限控制,通常需要基于表级,基于接口,一些项目要求权限管理基于字段级、行级,所以很多程序员提起权限细化都头痛。

Django框架提供了完整的用户认证与权限子系统,符合 不重复发明轮子(Don’'t Re-invent Yourself) 理念,开发工程师可以集中精力于业务逻辑的开发。下面就介绍,如何利用 django auth模块内置视图与组件,快速完成用户认证及权限控制的开发

需要指出,主流Python开发框架中只有Django提供了完整的用户认证与权限管理功能,而且使用简捷,支持定制扩展。Web类商业项目的开发工具,Django是1个非常靠谱的选择

2、Django演示项目环境准备

2.1 运行环境准备

为了初学者阅读方便,还是加上这一节吧

新建1个项目
django-admin startproject myproject

新建app, 在此笔者创建的app名称为 imgproc
cd myproject
python manage.py startapp imgproc

将app添加到项目配置文件
在setting.py 中将新建app加入INSTALLED_APPS

INSTALLED_APPS = [
	......
    'imgproc',
]

同步数据库

python manage.py makemigrations
python manage.py migrate

运行项目
python manage.py runserver, 默认端口 8000
这时应该可以访问 http://127.0.0.1:8000/ 了。

创建管理员帐号
python manage.py createsuperuser
访问http://127.0.0.1:8000/admin/ 检查登录是否正常。

至此,项目运行环境创建就算完成了。

2.2 演示项目准备

演示项目的代码及数据包括:,

  • 创建1个model UploadFile
  • 视图函数与视图类
  • URL config
  • 模板文件
  • 数据库测试数据
2.2.1 在imgproc应用中添加模型, models.py
# models.py 
from django.db import models
from django.urls import reverse

# Create your models here.
class UploadFile(models.Model):
    title = models.CharField(max_length=30)
    uploadfile = models.ImageField(upload_to="upload/")
    
    def __str__(self) -> str:
        return self.title
2.2.2 将model 加入后台 admin.py
from django.contrib import admin
from  imgproc.models import *
# Register your models here.

class UploadFileAdmin(admin.ModelAdmin):
    list_display = ['id','title','uploadfile']

admin.site.register(UploadFile,UploadFileAdmin)
2.2.3 编写视图函数与视图类 views.py

为了演示,使用了内置通用视图方式与函数式编程两个视图,可能你都会用到。

from django.shortcuts import render,redirect
from django.http import HttpResponse, FileResponse
# Create your views here.
from imgproc.forms import *
from imgproc.models import *
from django.views import generic
from django.urls import reverse_lazy
import os

class UploadfileListView(generic.ListView):
    """list all data """
    model = UploadFile
    template_name = "imgproc/uploadfile_list.html"

   
def download_file_stream(request,fid=1):
    """ Send file with FileResponse """
    obj = UploadFile.objects.get(pk=fid)
    fpath = os.path.join(settings.MEDIA_ROOT, obj.uploadfile.name)
    print(fpath)
    response = FileResponse(open(fpath,'rb' ))
    response['Content-Type'] = 'application/octet-stream'
    response["Content-Disposition"] = "attachment; filename=test.jpg"
    return response
2.2.4 URL config 配置

myproject/myproject/urls.py

from django.contrib import admin
from django.urls import path,re_path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('image/',include("imgproc.urls")),
]

imgproc.urls.py 代码

from django.urls import path,re_path
from imgproc.views import *

urlpatterns = [
name="upload_file_update"),
    path("list/", UploadfileListView.as_view(), name="upload_file_list" ),
    path("download/<int:fid>/",download_file_stream, name="download_file" ), 
]

2.2.5 编写显示数据的模板

在imgproc 下新建模板目录
mkdir templates/imgproc/ 子目录,创建template 文件 uploadfile_list.html, base.html 里引入了bootsrap4 来渲染

{% comment %}  uploadfile_list.html {% endcomment %}
{% extends './base.html' %}
{% block content %}
{% load static %}
    <div class="p-3 align-self-center border border-1 bg-light shadow-lg ">
        <h2>uploadfiles </h2>
        <ul class="list-group">
            {% for d in object_list %}
                <li class="list-group-item"> {{ d.id }} , {{ d.title }} , {{ d.uploadfile }} </li>
            {% endfor %}
        </ul>
    </div>

{% endblock %}  

2.2.6 添加测试数据并测试URL

通过 http://127.0.0.1:8000/admin/ , django 管理后台, 添加一些测试数据。
通过 http://127.0.0.1:8000/image/list/ 可以显示所有数据
Django 不到20行代码实现用户认证及权限管理完整功能
通过http://127.0.0.1:8000/image/download/1/ 可以下载图片。

3、用django内置视图完成用户认证

django.contrib.auth 用户认证模块内置了 User 模型与一套用户认证视图,直接使用这些组件开发,让用户认证变得异常简单,下面我们来看一下实现过程

3.1 导入内置视图的url

将auth模块的内置视的url加入在项目的urls,.py 中, 也就是myproject/myproject/urls.py 中添加:

urlpatterns = [
    ...., 
    path("accounts/", include("django.contrib.auth.urls")),  # new
]

3.2 添加 login.html 登录模板

在项目根目录下,创建模板目录
mkdir templates/registration/
cd templates/registration/
新建 login.html

...
<h2> 请登录 </h2>
<form method="POST">
       {% csrf_token %}
       {{ form.as_p}}
      <input type="submit" class="btn btn-success" value="登录">
</form>
...

另外要为logout 登出后指定前转页面,在项目的配置文件 myproject/myproject/settings.py 中添加配置

LOGOUT_REDIRECT_URL = "/account/login/"        # 登出后重定向页面

3.3 Django内置认证视图提供的url

在URL config中添加了include("django.contrib.auth.urls") 之后,就可以使用以下用户认址的URL 接口了, 包含用户登录,登出,修改密码,密码确认,重置密码等页面。

accounts/login/ [name='login']   
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
3.4 测试

尝试一下用管理员帐户登录

http://127.0.0.1:8000/accounts/login/ 

以及修改密码等URL

总共只用了2行代码,就完成了用户认证的后端开发,是不是很神奇。而且由于 django还是以安全性著称的,实现的这些接口安全性也可有效保证。

4、权限管理的实现

本文开头提到,权限管理需求包含: 基于页面操作与数据操作的权限控制, 下面分别介绍如何实现

4.1 基于URL页面的权限控制

思路就是,当用户访问url 页面时,先检查其是否已登录,如果没有登录或用户名密码不对,前转到登录页面

实现这1过程也非常简单
对于视图函数,前加1个装饰器 @login_required 即可

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def download_file_stream(request,fid=1):
    ......

实现功能: 如果request请求中的user 参数已登录过,则继续运行后面的语句,否则跳转到登录页面。

对于类方式实现的视图类,提供了LoginRequiredMixin基类,视图类用多继承方式来实现

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, ListView):
    login_url = '/accounts/login/'

注:LoginRequiredMixin一定要写在 ListView前面。

4.2 基于用户、表(模型)的数据访问权限

4.2.1 Django 用户数据权限管理的基本逻辑

当通过 makemigration 命令向数据库添加模型(表)时,默认为每个 Django 模型创建了四个权限:添加add、修改change、删除delete 和查看view。

在数据库的 auth_permission表中,每张表都有4个权限: add, change, delete, view,
比如,对于演示项目的 Uploadfile 模型来说,当在数据库中生成表时, 会在权限表 auth_permission 中,为Uploadfile 添加 4个权限,codename 字段值分别为:

  • view_uploadfile
  • add_uploadfile
  • change_uploadfile
  • delete_uploadfile

当你在管理后台,创建用户时,会列出上面的4个权限供选择。
如果打开数据库,会发现 User表与auth_permission 权限表是1对多关系,因此还有1张表: auth_user_permission 关系表,记录了每个user的赋予的权限。 可以通过该表查询具体的权限,

4.2.2 如何给用户添加数据操作权限

管理后台创建新用户时,添加权限,每张表都可以指定增删改查权限。无须编程实现。

可以进入 python manage,py shell 来检验一下用户权限(可以跳过此步),
如下例 ,新建用户test01, 在模型 uploadfile上有add权限,但没有 user模型的add权限, 对于 test01 用户,可以用 has_perm()方法来验证其在 两个模型上的权限

In [13]: user1 = User.objects.get(username="test01")
In [15]: user1.has_perm("imgproc.add_uploadfile")
Out[15]: True
In [16]: user1.has_perm("imgproc.add_user")
Out[16]: False
4.2.3 数据操作权限控制的实现

当客户端通过URL来访问数据时,如何判断用户是否有相应的操作权限呢?
**对于视图函数,**使用permission_required 装饰器来检查用户是否有权限。

from django.contrib.auth.decorators import permission_required

@permission_required('imgproc.view_uploadfile')
#@permission_required(('imgproc.add_uploadfile')
def download_file(request,fid=1):
   # …

如果要多检查1项权限,只须再添加1条装饰器语句。

对于视图类,提供了PermissionRequiredMixin基类,通过多继承方式实现:

from django.contrib.auth.mixins import PermissionRequiredMixin

class UploadfileListView(PermissionRequiredMixin,generic.ListView):
    """list all data if user has view permission """
     permission_required = ('imgproc.view_uploadfile', )

最多3行代码,就提供了完整的基于用户,基于表的数据操作权限控制。

@permission_required 失败会前转登录页面,(HTTP Status 302).
@PermissionRequiredMixin 失入发送403 (HTTP Status Forbidden).

5、总结

Django 的用户认证与权限子系统提供了1种快速实现的方式,只用了不到 20 行代码,就为项目添加了一套相当完善的用户认证与权限控制功能。
如果要对用户认证或权限做更深入的功能开发,如基于字段控制权限,就需要进一步理解 django 框架模型类,User类, Permission类的基本工作原理,django也提供了丰富的接口用于定制化开发。文章来源地址https://www.toymoban.com/news/detail-426945.html

到了这里,关于Django 不到20行代码实现用户认证及权限管理完整功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Django用户认证】通过阿里云如何实现实名认证

    我最近在我的项目上有实名认证的需求,主要实现人名和身份证号码的验证,针对这一块具体怎么做的文章比较少,我解决问题之后,觉得还是把这些坑都写清楚,方便初学者。 网络并非法外之地。然而,却存在部分网络用户利用虚拟的网络空间,实施网络暴力、造谣诽谤、

    2024年02月06日
    浏览(60)
  • Django用户认证: 利用Django Auth模块实现用户注册、登录与登出

    用户登录注册属于用户认证的一部分,Django内置了一套用户认证体系,使用起来比较方便,而且支持用户定制和拓展,足以满足任何复杂的业务需求。 Django框架中,用户权限管理被划分为三个层次: 用户 :系统使用者,拥有自己的权限。可被一个或多个用户组包含。 用户组

    2023年04月20日
    浏览(58)
  • flask框架-认证权限(一):使用g对象存登录用户信息,认证权限一起实现

    apps         -user         __init__.py authen        __init__.py         token.py ext         __init__.py util.py        public.py         __init__.py app.py 依赖包 authen/token.py user/views.py 认证大致的逻辑: 1、用户登录时,生成token,前端保存token信息 2、前端发起请求时,将token携带在cook

    2024年02月09日
    浏览(44)
  • 尚融宝20-实现用户注册和用户认证

    目录 一、需求 二、前端整合发送验证码 三、实现用户注册 1、创建VO对象 2、定义常量 3、引入MD5工具类 4、Controller 5、Service 6、前端整合 四、实现用户登录 1、后端整合JWT 2、前端整合 五、校验用户登录 1、后端 2、前端   点击获取验证码后先对手机号进行验证是否为空,其

    2023年04月21日
    浏览(54)
  • Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现

    在网上商城项目中,用户的安全性是非常重要的。为了实现用户权限认证和安全校验,我们可以使用Spring Security、JWT和Redis来实现。本篇博客将详细介绍后端和前台的实现过程,并提供相应的代码案例。 当用户点击登录按钮时,前端发送一个POST请求到后端的登录接口,传递用

    2024年02月07日
    浏览(55)
  • Spring Security实现用户身份验证及权限管理

    Spring Security是Spring生态的一个成员,提供了一套Web应用安全性的完整解决方案。 Spring Security 旨在以一种自包含的方式进行操作,因此你不需要在 Java 运行时环境中放置任何特殊的配置文件。这种设计使部署极为方便,因为可以将目标 工件 (无论是 JAR还是WAR)从一个系统复

    2024年02月05日
    浏览(40)
  • Jenkins工具系列 —— 插件 实现用户权限分配与管理

    点击 左侧的 Manage Jenkins — Plugins —— 左侧的 Available plugins 点击 左侧的 Manage Jenkins — Security a、安全域(委托给servlet容器、Jenkins自己的用户数据库、LDAP、Unix 用户/组数据库)- Jenkins自己的用户数据库 b、允许用户注册 c、授权策略(任何人都可以做任何事、传统模式、登入

    2024年02月10日
    浏览(44)
  • django authenticate--用户身份认证

    authenticate Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,与已配置的身份验证后端进行比较。 当用户尝试登录时,authenticate()函数将使用用户的凭据(即用户名和密码)作为参数进行调用,该函数然后检查可用的身份验证后端以验证凭据,这些后端在

    2024年02月05日
    浏览(58)
  • Django_内置的用户认证系统

    目录 一、用户对象 1. 创建用户 2. 修改密码 3. 用户验证 二、权限与授权 1. 默认权限 2. 用户组 3. 在代码中创建权限 4. 权限缓存 三、在视图中认证用户 1、登录用户 2、注销用户 3、用户登录的访问限制 3.1、原始的办法 3.2、函数视图使用login_required装饰器 3.3、类视图继承Log

    2024年02月13日
    浏览(44)
  • Django REST Framework完整教程-认证与权限-JWT的使用

    阅读本文之前,请读者先阅读: https://plugin.blog.csdn.net/article/details/133853377,如果已经知晓Django REST Framework的基础,可以继续阅读本文内容。 认证(Authentication)与权限(Permission)不是一回事。认证是通过用户提供的用户ID/密码组合或者Token来验证用户的身份。权限(Permission)的校验

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包