Django学习之九: auth 认证组件
Django auth 认证组件
Django提供的auth认证组件,提供了: 用户表的构建方式(用于满足符合auth组件);提供了认证接口;提供了会话登录和会话注销的接口 ;提供了中间件将会话登录用户保存到request对对象中,这样可以很轻易的拿到登录用户,不用我们再从会话中获取用户id,再通过model获取到用户对象;对于认证接口要提供用户名和密码传入auth.authenticate(username,password),认证成功,就可以得到认证用户对象。我们只需要根据认证结果是否有对象,来判定认证结果,来进行后面的操作。同时返回的用户对象传入auth.login(request, user)接口,调用接口,可以将用户登录信息记录到session中,并且如果添加了auth的一个中间件AuthenticationMiddleware,那么每次请求会在request.user中保存该登录的用户对象。如果没登陆request.user会保存一个anonymouseuser用户,这样就可以通过request.user的API来判定本次请求是否是某个用户登录状态。这点是auth组件关键点,这也是涉及到隐含session记录创建和auth中间件对request对象的操作。
配置使用auth组件及其中间件
- 将auth app注册到installed_apps列表中。即将‘django.contrib.auth’添加到列表中。
- 将contenttypes app注册到installed_apps列表中。即将‘django.contrib.contenttypes’添加到列表中。这是django的 content type system, 有关权限的。
- 确保两个中间件添加到配置文件MIDDLEWARE列表中:
- 'django.contrib.sessions.middleware.SessionMiddleware'
- 'django.contrib.auth.middleware.AuthenticationMiddleware'
- 设置auth组件使用的认证用户表即Model。默认会使用auth模块的 auth.User这个model.这个设置参数是AUTH_USER_MODEL='appname.UserModel' 这个值是app名字和模块名,中间使用点连接,不用指定模块名。这点要注意。
- 注意自定义的认证model类,这个model类必须继承django.contrib.auth.models.AbstractUser类。该类提供了用户名和密码还有邮箱等字段。只需要自定义一些自己的字段就可以了。主要提供了:
- username
- password
- first_name
- last_name
- 定义自己的认证model类,实例:
from django.contrib.auth.models import AbstractUser
from django.db import models
class Users(AbstractUser):
age = models.IntegerField(verbose_name='年龄', blank=True, null=True)
telephone = models.CharField(verbose_name='手机号', max_length=32)
address = models.CharField(verbose_name='住址', max_length=255)
def __str__(self):
return self.username # username属性继承自AbstractUser
- settings文件中对应的AUTH_USER_MODEL = 'appname.Users' ,appname就是model所在的app名称了。
- 最后一个和是否已认证登录校验相关的配置:LOGIN_URL 该设置定义了登录url。用于auth组件提供的@login_required 装饰器,装饰器用于装饰view视图函数,当视图函数需要校验用户登录才能访问时,
request.user 可以直接在template模版中使用
方便在模版系统中渲染登录用户的信息。前提是使用auth组件进行会话登录及其中间件。
auth组件常用api
- auth.authenticate(username= login_name, password = pwd) 认证成功返回User对象,失败返回None.
- auth.login(request, user) # 注意request是必须的,是请求对象,user是通过authenticate认证后得到的。作用会话登录,将登录信息保存到会话中。如果当前会话已经产生会flush。
- request.user # 这个就是一个django.utils.functional.SimpleLazyObject对象,如果authenticate认证成功,返回的对象是model-user对象,也就是auth_user表对象;将该对象进过auth.login后,那么request.user就是相应的该用户;不然就是一个anonymous用户。通过request.user可以判定是否有用户登录。重要:request.user是一个全局变量,可以在视图和模版中使用。
- auth.logout(request) 登出当前session中登录的用户,如果没有用户登录,也不会报错。登出后request.user就是annoymouse用户了。会清空会话。
- reques.user.username可以判定是否有用户登录。不能使用request.user判定是否有用户登录,因为没有用户登录,这个也会返回一个annoymouse用户,只有访问其属性才会返回一些False值。所以通过request.user.* 的属性才能判定是否有用户登录的状态。
- request.user.is_authenticated 判定是否登录返回True或False.
- django.contrib.auth.get_user_model() 可以获取到当前auth组件使用的认证model类。
注意区别两个API判定 ‘是否认证’ 与 ‘是否认证成功的区别’
即 auth.authenticate() 与 request.user.is_authenticated 的使用场景和功能区别:
- 两者看上去都是认证有关系,但两种使用场景和目的是不同的。
- 前者 是 认证 ,其返回的结果是User_obj 或者 None,目的是判定认证是否成功,仅仅使用在登录认证view视图函数中。
- 后者 是 是否有用户登录, 其返回结果是True 或者False。目的是校验用户是否登录了,用于除了登录认证view与不校验用户登录的view。即需要校验用户登录状况才有后续操作的情景中。这个的前提是auth.authenticate和auth.login 两个登录过程操作。只有两者操作了,才有登录的判定。
获取认证model类
- 通过django.contrib.auth.get_user_model()
- 如果要在其它model类关联使用的认证model类,最好通过django.conf.settings.AUTH_USER_MODEL获取。这是最佳实践,关联认证model类。因为如果直接引用,万一改变了model认证类的化,还要来改变这里的代码。
- 以上两种方式是可以互换的。
认证检测装饰器@login_required
导入语句: from django.contrib.auth.decorators import login_required
用法:用于装饰需要视图函数;使用了该装饰器的函数,会判定是否已登录用户,如果没有将重定向到settings.LOGIN_URL指定的url并带上一个next参数,next参数传入当前视图访问的绝对路径,已用于在登录后跳转的路径。这样,login视图在登录成功后的跳转,就可以从next提交的值获取,并设置一个获取不到的默认值为'index'首页就可以了。很方便的装饰器和其修改的next参数,其中next可用于模版中。
用法:
@login_required
def list_customer(request):
"""
查看用户列表
:param request:
:return:
"""
pass
return HttpResponse('用户列表')
auth模块大大前提是,使用django的user model作为用户存储
如果要自定义,可以继承AbstractUser这个抽象model。这就涉及到了model的继承。抽象继承属于model继承的table_per_class模式。
user model提供了创建user object 的接口create_user();修改密码的接口user.set_password()。这个操作普通model直接操作create,update数据不同,必须通过接口,因为密码是加密存储的。
利用auth组件的登录视图函数:
# 登录验证页面
def login(request):
if request.method == 'POST':
response = {
'user': None,
'msg': None,
}
login_name = request.POST.get('username') # 因为使用的是ajax提交表单数据,对于表单数据的校验就放到前端吧.
pwd = request.POST.get('password')
valid_code = request.POST.get('valid_code')
if valid_code.upper() == request.session['valid_code'].upper(): # 只做验证码校验和用户认证校验。
user = auth.authenticate(username=login_name, password=pwd)
if user:
auth.login(request, user) # 这样request.user 就会有当前登录对象
response['user'] = user.username
return JsonResponse(response)
else:
response['msg'] = '用户名或密码错误!'
return JsonResponse(response)
else:
response['msg'] = '验证码错误!'
return JsonResponse(response)
return render(request, 'myblog/login.html')
小结
- 感觉使用auth组件后,auth组件的耦合度太高了,不好扩展了。虽然提供的一些认证,登录会话等比较好用,但是想自己扩展就比较难。所以还是少用auth组件,使用自己的认证吧,可以利用auth提供的一些工具API, 到我们自己的认证代码中。如:密码的hash。
Django学习之九: auth 认证组件的更多相关文章
- auth认证组件
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- auth 认证组件的补充
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- 16、Auth认证组件
1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...
- Django 学习第十二天——Auth 系统
一.Auth系统中的表: 从表的名称我们就能看出, auth_user,auth_group,auth_permission分别 存放了用户,用户组,权限的信息表. 另外三张表就是多对多的关系表 Us ...
- Django学习(九)---Templates过滤器及Django shell和Admin增强
一.Templates过滤器 过滤器属于django模板语言 修改模板中的变量,从而显示不同内容 {{ value | filter }} 举例:{{ list_nums | length}} ...
- Django:(7)auth用户认证组件 & 中间件
用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuper ...
- 061.Python前端Django组件用户认证组件
一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...
- Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API
用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
随机推荐
- UML用法及状态图,活动图介绍
统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制 ...
- hive删除表和表中的数据
hive删除表和表中的数据,以及按分区删除数据 hive删除表: drop table table_name; hive删除表中数据: truncate table table_name; hive按 ...
- jdk源码阅读笔记-String
本人自学java两年,有幸初入这个行业,所以功力尚浅,本着学习与交流的态度写一些学习随笔,什么错误的地方,热烈地希望园友们提出来,我们共同进步!这是我入园写的第一篇文章,写得可能会很乱. 一.什么是S ...
- go语言调度器源代码情景分析之四:函数调用栈
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第3小节. 什么是栈 栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需 ...
- 第8章 动态客户端注册 - IdentityModel 中文文档(v1.0.0)
OpenID Connect动态客户端注册的客户端库是作为HttpClient扩展方法提供的. 以下代码发送注册请求: var client = new HttpClient(); var respo ...
- 第6章 令牌撤销端点(Token Revocation Endpoint) - IdentityModel 中文文档(v1.0.0)
OAuth 2.0令牌撤销的客户端库是作为扩展方法提供的HttpClient. 以下代码撤消撤销端点处的访问令牌令牌: var client = new HttpClient(); var resul ...
- 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)
一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端 24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器 想体验服务的时候 ...
- spring boot整合mybatis方式一
方式一: 导入maven依赖: <!--web依赖配置--> <dependency> <groupId>org.springframework.boot</ ...
- openlayers4 入门开发系列之图层控制(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- 第六周LINUX学习笔记
DNS服务 DNS:Domain Name Service //协议 实现:BIND(Berkeley Internet Name Domain) 监听端口: UDP:5 ...