title: Django-登陆验证
copyright: true
top: 0
date: 2019-07-19 11:14:26
tags:
categories: WEB 后端框架
permalink:
password:
keywords: Django-auth
description: 使用Django自带的登陆登出以及访问权限设置进行讲解。

可是我在家里什么也没有啊,要是家里什么也没有,你会回去吗?

使用Django自带的认证模块的方法,不需要任何其他第三方的包。

参考地址1

参考地址2

参考地址3

基本配置

新建一个app,取名为users,并在settings.py的INSTALLED_APPS中加入’users’

其他的按照常规的套路走一遍即可

settings.py中设置认证的用户模型,并对语言和时区进行修改。

LANGUAGE_CODE = 'zh-hans' #修改
TIME_ZONE = 'Asia/Shanghai' #修改
AUTH_USER_MODEL = 'users.User' #添加

创建用户密码模型

自定义的用户模型,继承AbstractUser,获得username、password、email、first_name、last_name等属性,可以自己添加相关的属性。

# users/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser# Create your models here.class User(AbstractUser):nick_name = models.CharField(max_length=50, blank=True)class Meta(AbstractUser.Meta):pass

注册部分

注册表单

#users/forms.py
from django.contrib.auth.forms import UserCreationForm
from .models import Userclass RegisterForm(UserCreationForm):class Meta(UserCreationForm.Meta):model = User #表单对应的模型fields =("username", "email") #需要渲染的控件。默认有用户名、密码、密码确认,此处增加email

注册页面

#templates/registration/register.html
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css"><title>注册</title><style>.errorlist{color: red;}</style>
</head>
<body><div class="flex-center"><div class="container"><div class="flex-center"><div class="unit-1-2 unit-1-on-mobile"><h3 class="flex-center">注册</h3><form class="form" action="{% url 'users:register' %}" method="post">{% csrf_token %}{% for field in form %}{{ field.label_tag }}{{ field }}{{ field.errors }}{% if field.help_text %}<p class="help text-small text-muted">{{ field.help_text|safe }}</p>{% endif %}{% endfor %}<button type="submit" class="btn btn-primary btn-block">注册</button></form></div></div></div></div>
</body>
</html>

注册视图函数

#users/views.py
def register(request):if request.method == 'POST':form = RegisterForm(request.POST)if form.is_valid():form.save()return redirect('/')else:form = RegisterForm()return render(request, 'registration/register.html', context={'form': form})

在urls.py中添加注册的url

# learn_auth/urls.py:
from django.conf.urls import url, include
from django.contrib import admin
from users import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^users/', include('users.urls')),url(r'^users/', include('django.contrib.auth.urls')),url(r'^$', views.index, name='index'),
]

再user项目下添加注册url

#users/urls.py:
from django.conf.urls import url
from . import viewsapp_name = 'users'urlpatterns = [url(r'^register/', views.register, name='register')
]

启动服务器

127.0.0.1:8000/users/register

登陆部分

Django 自带有登录的视图函数,url模式在django.contrib.auth.urls中,在工程的urls.py中添加该url即可访问到

url(r'^users/', include('django.contrib.auth.urls'))

自带的视图函数会自动检查数据库,给出登录结果,我们要做的就是提供一个模板文件,用以输入信息和显示登录结果。

登录模块默认调用templates/registration/login.html模块,因此,需要在registration目录下新建login.html

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>登录</title><link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css"><style>.errorlist {color: red;}</style>
</head>
<body>
<div class="flex-center"><div class="container"><div class="flex-center"><div class="unit-1-2 unit-1-on-mobile"><h3>登录</h3><form class="form" action="{% url 'login' %}" method="post">{% csrf_token %}{{ form.non_field_errors }}{% for field in form %}{{ field.label_tag }}{{ field }}{{ field.errors }}{% if field.help_text %}<p class="help text-small text-muted">{{ field.help_text|safe }}</p>{% endif %}{% endfor %}<button type="submit" class="btn btn-primary btn-block">登录</button><input type="hidden" name="next" value="{{ next }}"/></form><div class="flex-left top-gap text-small"><div class="unit-2-3"><span>没有账号?<a href="{% url 'users:register' %}">立即注册</a></span></div><div class="unit-1-3 flex-right"><span><a href="{% url 'password_reset' %}">忘记密码?</a></span></div></div></div></div></div>
</div>
</body>
</html>

新建index.html,在其中判断用户是否已登录,若未登录则给出登录连接

使用的代码块为 URL

登出部分

注销不需要模板,直接调用{% url 'users:register' %}即可。

修改密码部分

password_change_form.html和password_change_done.html

当用户需要修改密码时,调用的自带视图函数地址为

{% url 'password_change' %}?next={{ request.path }}

需要做的,是添加修改页面和修改成功页面两个html模板

password_change_form.html
password_change_done.html

修改内容如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>修改密码</title><link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css"><style>.errorlist {color: red;}</style>
</head>
<body>
<div class="flex-center"><div class="container"><div class="flex-center"><div class="unit-1-2 unit-1-on-mobile"><h1><a href="{% url 'index' %}">Django Auth Example</a></h1><h3>修改密码</h3><form class="form" action="{% url 'password_change' %}" method="post">{% csrf_token %}{{ form.non_field_errors }}{% for field in form %}{{ field.label_tag }}{{ field }}{{ field.errors }}{% if field.help_text %}<p class="help text-small text-muted">{{ field.help_text|safe }}</p>{% endif %}{% endfor %}<button type="submit" class="btn btn-primary btn-block">确认修改</button></form></div></div></div>
</div>
</body>
</html>

以及:

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>密码修改成功</title><link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css">
</head>
<body>
<div class="flex-center"><div class="container"><div><h1 class="logo"><a href="{% url 'index' %}">Django Auth Example</a></h1><p>密码修改成功!</p></div></div>
</div>
</body>
</html>

重置密码部分

需要文件

password_reset_form.html、password_reset_confirm.html、password_reset_done.html、 password_reset_complete.html

一般重置密码流程为:用户点击“忘记密码”,页面跳转到reset_form.html,输入邮箱和相关信息,点击提交,页面跳转到reset_done页面。后台发送重置邮件给用户,并提供重置密码的页面地址,用户打开reset_confirm页面,设置新的密码并提交,页面跳转到reset_complete页面。

django自带发邮件的功能,只需要在settings.py中进行相关配置,如下面的配置是把邮件发送给终端

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

调用自带重置密码的

url:{% url 'password_reset' %}

reset_form和reset_conform的主要部分的内容如下(reset_done和reset_complete只是简单的静态提示内容)

password_reset_form.html :

<form class="form" action="{% url 'password_reset' %}" method="post">{% csrf_token %}{{ form.non_field_errors }}{% for field in form %}{{ field.label_tag }}{{ field }}{{ field.errors }}{% if field.help_text %}<p class="help text-small text-muted">{{ field.help_text|safe }}</p>{% endif %}{% endfor %}<button type="submit" class="btn btn-primary btn-block">提交</button>
</form>

password_reset_confirm.html

<form class="form" method="post">{% csrf_token %}{{ form.non_field_errors }}{% for field in form %}{{ field.label_tag }}{{ field }}{{ field.errors }}{% if field.help_text %}<p class="help text-small text-muted">{{ field.help_text|safe }}</p>{% endif %}{% endfor %}<button type="submit" class="btn btn-primary btn-block">提交</button>
</form>

扩展

自带的模块只能通过用户名和密码来认证,如果想要登录时可以通过邮件等其他方式来认证,需要自定义认证模块。

在users目录下新建backends.py,实现authenticate和get_user方法from .models import Userclass EmailBackend(object):def authenticate(self, request, **credentials):# 要注意登录表单中用户输入的用户名或者邮箱的 field 名均为 usernameemail = credentials.get('email', credentials.get('username'))try:user = User.objects.get(email=email)except User.DoesNotExist:passelse:if user.check_password(credentials["password"]):return userdef get_user(self, user_id):"""该方法是必须的"""try:return User.objects.get(pk=user_id)except User.DoesNotExist:return None

配置settings.py:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend','users.backends.EmailBackend',
)

django自带的验证机制

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout  #登入和登出from django.contrib.auth.decorators import login_required  # 验证用户是否登录def acc_login(request):if request.method == "POST":username = request.POST.get("username")password = request.POST.get("password")user = authenticate(username=username,password=password)  # 类型为<class 'django.contrib.auth.models.User'># print(type(models.Customer.objects.get(name="赵凡")))# print(user,type(user))if user:login(request,user)  # 验证成功之后登录return  redirect('/crm')return render(request, "login.html")def acc_logout(request):logout(request)  # 登出return redirect("/login")

必须登录之后才能访问页面

from django.contrib.auth.decorators import login_required@login_required  # 加上这个装饰器就是限制必须登录才能执行这个函数
def dashboard(request):print(request.user)return render(request, "crm1/dashboard.html")

如果加了@login_required,页面跳转会有问题,解决方法如下
在setting里追加一下内容/login/跟URL是一致的

LOGIN_URL = "/login/"

其他资料

创建用户

Django默认提供了用户权限管理模块auth,在我们第一次数据库迁移时,他就自动帮我们在数据库中创建三张表:

user表,User是auth模块中维护用户信息的表,在数据库中该表被命名为auth_user. 该表继承自Abstractuser.

group表,定义用户组模型,该表只包含一个name字段和一个permissions(权限)多对多关系字段,在数据库中被命名为auth_group.

Permission, 权限表,提供表级别的权限控制,可以检查用户是否对某个表拥有增(add),改(change),删(delete)权限。

从数据库生成的表来看,这三张表实现了两两多对多的关联,其中用户和组生成的第三张表是

auth_user_groups,group和permission生成的第三张表是auth_group_permissions,用户和权限生成的第三张表是auth_user_user_permissions。这里我们主要介绍下user表。

User表

在auth中user继承自AbstractUser,其中AbstractUser又继承自AbstractBaseUser和PermissionsMixin,其中AbstractBaseUser只保存了密码和登陆时间,PermissionsMixin提供了权限先关的字段,比如:is、_superuser和组合权限表之间的关联。

User对象的字段

password:Django默认保存是加密后的密码,无法直接看到明文密码
last_login:上一次登陆时间
is_superuser:是否是超级管理员,是为1,否为0
username:用户名
first_name
last_name
email:邮箱
is_staff:用户是否拥有网站的管理权限
is_active:是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
data_joined:账户创建日期
groups: 与组多对多关联的字段
user_permissions: 与权限关联的多对多字段,也就是是说明了为什么第三张表表为auth_user_user_permissions. 表名(user)+字段名(user_permissions)

类属性

is_authenticated:判断是否被认证,即是否登陆
is_anonymous: 是否为匿名用户
username_validator:指向用于验证用户名的验证实例,默认是validators.UnicodeUsernameValidator

类方法

get_username():  获取用户名
get_full_name(): 获取全名,即first_name+空格+last_name
get_short_name():获取first_name
set_password(raw_password): 设置密码,如果raw_password是None,则密码将被设置为不可用的密码,就像使用了 set_unusable_password() 一样。
check_password(raw_password): 检查密码是否正确。
set_unusable_password():将用户标记为未设置密码,即密码为None
has_usable_password():返回该用户是否未设置密码
get_group_permissions(): 获取这个用户所在组中所具有的的全部权限。
has_perm(): 判断一个用户是否具有某个权限。
has_perms(perm_list): 判断用户对一个权限列表是否具有权限。
has_module_perms(package_name): 判断对app是否有权限。

Auth模块常用方法

创建用户

python manage.py createsuperuser
python manage.py createuser

模块导入

from django.contrib import auth

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的,认证失败返回None。

user = auth.authenticate(username='theuser',password='thepassword')

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

def my_view(request):username = request.POST['username']password = request.POST['password']user = auth.authenticate(username=username, password=password)if user is not None:auth.login(request, user)# Redirect to a success page....else:# Return an 'invalid login' error message.

logout(request):

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

def logout_view(request):auth.logout(request)# Redirect to a success page.

is_authenticated():

用来判断当前请求是否通过了认证。

def my_view(request):if not request.user.is_authenticated():return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd():

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图函数添加登录校验。

from django.contrib.auth.decorators import login_required@login_required
def my_view(request):...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。 LOGIN_URL = ‘/login/’ # 这里配置成你项目登录页面的路由

method_decorator():

auth 给我们提供的一个装饰器工具,用来快捷的给某个类视图添加登录校验。

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decoratorclass Home(views.View):@method_decorator(login_required)def get(self, request):return render(request, 'home.html')

create_user():

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import Useruser = User.objects.create_user(username = '用户名', password = '密码', email = '邮箱', ...)
check_password(password)

create_superuser():

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import Useruser = User.objects.create_superuser(username = '用户名', password = '密码', email = '邮箱', ...)
check_password(password)

欢迎关注公众号:【安全研发】获取更多相关工具,课程,资料分享哦~

Django-登陆验证相关推荐

  1. vue之axios 登陆验证及数据获取

    登陆验证,获取token methods:{callApi () {var vm = thisvm.msg = ''vm.result = ''//验证地址vm.loginUrl= 'http://x ...

  2. ssm过滤器可以只过滤html吗,SSM登陆验证之过滤器实现

    开发中登陆验证是必不可少的,这里介绍过滤器实现的登陆验证. 第一步:创建一个过滤器 package com.test.filter; import java.io.IOException; impor ...

  3. struts2中用户登陆验证的常用方法

    一般我们在登陆验证窗口输入用户名或密码后,会将这些信息与数据库中的相关信息进行匹配,如何正确,就会返回到相应的页面,如果不正确,在登陆窗口会显示用户名或密码不正确的警告. struts2中的做法: 在 ...

  4. JavaWeb学习笔记①——Java向下转型在JavaEE中运用——登陆验证

    在学习JavaEE的过程中慢慢了解到Java中编程思想的优秀设计,以下将是一个多态-向下转型的示例,该实例是在Servlet-过滤器中的登陆验证的示例,代码中运用向下转型解决问题 import jav ...

  5. Java的登陆验证问题

    java中的登陆验证问题可以有多种方式进行验证,通过拦截器功能完成,可以通过过滤器功能完成,也可以简单的代码在JSP页面中单独完成,其中都 涉及到一个关键的验证步骤,这个验证原理ASP,PHP,JAV ...

  6. python编写一个登陆验证程序_python项目实战:实现验证码登录网址实例

    前言 相信大家都明白,大多数的网站为了不被恶意访问,往往需要设置验证码登录,避免机器人访问,而造成我服务器瘫痪,崩溃,这里用到Python3,主要用到的包是re urllib.request http ...

  7. yii 前后台分离及登陆验证

    2019独角兽企业重金招聘Python工程师标准>>> 比较合理的做法其实是分成两个框架来布署:然而这样说法也太绝对. 事实上是针对不同系统,应采用不同的方法.如为CMS系统,则不需 ...

  8. java 登陆验证失败_使用Java 8流进行快速失败的验证

    java 登陆验证失败 我已经失去了看过使用快速失败验证代码状态的代码的次数,方法如下: public class PersonValidator {public boolean validate(P ...

  9. php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能

    本文主要简单讲述了如何使用php实现简单的用户登陆以及登陆验证效果. 1.首先实现通过Session实现用户的登录 那么什么是session呢? session被译为会话,它主要是为了在一定访问期间在 ...

  10. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

最新文章

  1. win7 设置自动关机
  2. wxWidgets:wxListBox类用法
  3. BZOJ2956 (模积和)
  4. windows下多tomcat部署
  5. 后台审核管理 ergo_Kogito,ergo规则—第2部分:规则的全面执行模型
  6. [LintCode] Reverse Pairs 翻转对
  7. 2017.10.2 loli测试
  8. 协议圣经 -协议之服务编写(九)
  9. @ApiImplicitParam注解的dataType、paramType两个属性的区别?
  10. google支付接入PHP语言,PHP语言开发Paypal支付demo的具体实现
  11. 用SetCapture捕获鼠标消息
  12. 推荐一款桌面弹窗广告拦截软件【桌面弹窗广告屏蔽】
  13. 使用certbot openresty执行获取 Let’s Encrypt https 免费证书
  14. tensorflow框架下,多进程model.predict(x)无响应/暂停/无输出
  15. 不知道如何裁剪视频画面尺寸?这篇文章告诉你如何视频裁剪画面
  16. 浙大计算机城市学院联合培养,浙大城市学院 今日视点 城市学院2007届联合培养硕士研究生顺利毕业...
  17. 【leetcode】脑子打结的题
  18. 张艾迪(创始人):年少创业与干净的我
  19. python自动发邮件报554错误_python-自动化测试结果发送邮件报错(smtplib.SMTPDataError: (554, b'DT:SPM 163……)解决方法...
  20. 计算机网络原理第六篇 应用层

热门文章

  1. rockchip rk3368(px5)车载开发之路4,使能GPS模块UC6226(1.驱动层)
  2. 2022年起重机械指挥操作证考试题模拟考试平台操作
  3. 2022年A特种设备相关管理(电梯)复训题库及答案
  4. 如何测量和跟踪SEO:跟踪搜索引擎优化性能
  5. cpu对寄存器的访问速度最快
  6. 零基础怎么报考华为认证,怎么学习?
  7. Ubuntu 18 上不了网解决方法
  8. 一个c语言程序有两个源文件,建立多个源文件的C语言程序.pdf
  9. CPU时钟周期、主频、CPI、MIPS
  10. Excel批量为数值列加绿色小三角