Django 用户认证系统使用总结
Django用户认证系统使用总结
测试环境
Win7
Django 1.11
使用Django认证系统
本文按默认配置讲解Django认证系统的用法。如果默认的认证无法满足项目,Django提供了对认证系统的扩展与定制。
Django身份验证同时提供身份验证和授权,通常称为身份验证系统,因为这些特性有些耦合。
用户对象
默认user对象主要属性:
- username
- password
- first_name
- last_name
创建用户对象
>>>fromdjango.contrib.auth.modelsimportUser
>>>user=User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
#如上,此时用户对象已经被保存到数据库了,可以对它的属性进行修改
>>>user.last_name='Lennon'
>>>user.save()
如果已经安装了Django admin应用,可以直接创建用户
创建超级用户
使用createsuperuser 命令:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
回车后,会提示输入密码,输入密码后回车,立即创建用户。如果命令行省略了--username 或--email 选项,则回车后还会提示输入这些选项的值。
修改密码
Django采用hash算法存储用户密码(参考documentation of how passwords are managed)
通过命令行修改用户密码:
manage.py changepassword user_name
如果不提供user_name,则默认修改当前系统用户的密码.
通过api修改用户密码
>>>fromdjango.contrib.auth.modelsimportUser
>>>u=User.objects.get(username='john')
>>>u.set_password('new password')
>>>u.save()
注:这里new password为明文
如果已经安装了Django admin应用,也可以在认证系统管理页面修改用户密码
修改密码,将注销对应用户的所有会话。
用户认证
authenticate
(request=None, **credentials)
使用authenticate()来确认一系列认证。函数携带了credentials关键词参数,默认情况为username和password。如果认证通过,则返回对应的User对象,否则返回None:
fromdjango.contrib.authimportauthenticate
user=authenticate(username='john', password='secret')
ifuserisnotNone:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials
除username,password参数之外,我们还可以添加其它条件:
例子,验证用户账号密码是否正确,同时要求被验证用户未被删除(is_delete=1),也就是说,验证用户账号密码前获取的用户数据时,自动已经被删除的用户
user=authenticate(username='john', password='secret',is_delete=1)
当然,除了是否删除,是否禁用等字段,其它字段一般不推荐这么做,可以在验证用户账号密码前进行其它前置条件的验证
注意:默认的,django会优先验证我们显示提供的参数,最后再验证is_active是否未1,如果为1,则返回None
权限和认证(Permissions and Authorization)
略
Web请求中的认证
Django为每个请求提供了 request.user属性,该属性代表当前用户。如果当前用户未登录,则该属性值将被设置为一个匿名用户AnonymousUser,否则将设置为User的一个实例。
ifrequest.user.is_authenticated:# 已登录
# Do something for authenticated users.
...
else:# 未登录
# Do something for anonymous users.
...
登录
login
(request, user, backend=None)[source]
login函数会保存用户id到session.
注意:用户登录后,会话中依旧保留登录前的的任何匿名会话数据。
fromdjango.contrib.authimportauthenticate, login
defmy_view(request):
username=request.POST['username']
password=request.POST['password']
# 验证用户名和密码,返回用户对象
user=authenticate(request, username=username, password=password)
ifuserisnotNone:
login(request, user)
# do something 比如重定向到一个成功页面.
...
else:
# do something,比如返回一个登录错误消息
...
选择认证后端(backend)
略.
退出
logout
(request)
例子:
fromdjango.contrib.authimportlogout
deflogout_view(request):
logout(request)
# do something 比如重定向到一个成功页面.
注意:如果用户未登录,执行logout函数并不会抛出任何异常。
调用logout函数,会清空当前请求的所有会话数据,移除所有已存在数据。
对登录用户的访问限制
原始方式
简单,原始的方式就是检查request.user.is_authenticated判断是否认证:
fromdjango.confimportsettings
fromdjango.shortcutsimportredirect
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnredirect('%s?next=%s'% (settings.LOGIN_URL, request.path))
# ...
或者:
fromdjango.shortcutsimportrender
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnrender(request, 'myapp/login_error.html')
# ...
login_required装饰器
login_required
(redirect_field_name='next', login_url=None)
作为快捷方式,可以使用login_required():
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required
defmy_view(request):
...
login_required() 做以下事情:
- 如果用户未登录,重定向到settings.LOGIN_URL变量指定的url,并把当前请求的绝对URL赋值给查询字符串。例: /accounts/login/?next=/polls/3/.
- 如果用户已登录,正常执行视图。
默认的,查询字符串参数名称为“next”,如果想用其它名称,需要使用loging_required的可选参数redirect_field_name,举例如下
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(redirect_field_name='my_redirect_field')
defmy_view(request):
...
对应的,html模板中也要使用对应参数名称。
login_required()还携带了可选参数 login_url。例:
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(login_url='/accounts/login/')
defmy_view(request):
...
注意,如果不指定login_url参数,则需要配置settings.LOGIN_URL.
更多详情,参考官方文档。
一些常见的装饰器
@require_POST # 设置视图的http访问方法必须为POST
@require_GET # 设置视图的http访问方法必须为GET
例子:设置视图的访问方法必须为POST
from django.views.decorators.http import require_POST,require_GET
@require_POST def test_page(request): return render(request, 'website/pages/mytest.html',{})
访问效果
The LoginRequired mixin
略
Limiting access to logged-in users that pass a test
略
The permission_required decorator
The PermissionRequiredMixin mixin
略
Redirecting unauthorized requests in class-based views
略
Session invalidation on password change
略
Authentication Views
略
Using the views
略
All authentication views
略
Helper functions
略
Built-in forms
略
模板中的认证数据
当使用RequestContext,并且开启了'django.contrib.auth.context_processors.auth'上下文处理器时(可在settings.py中配置),当前已登录用户和他们的权限都被存储为变量,存放在模板上下文中。
Users
例子:
{%ifuser.is_authenticated%}
<p>Welcome, {{user.username}}. Thanks for logging in.</p>{%else%}
<p>Welcome, new user. Please log in.</p>{%endif%}
如果未使用RequestContext,则模板变量不可获取,比如上述的 {{ user }}
Permissions
略
Managing users in the admin
略
参考链接
https://docs.djangoproject.com/en/2.1/topics/auth/
- 【Go 语言社区】GO语言练习:网络编程 ICMP 示例
- Golang的json操作
- 【Go 语言社区】golang协程——通道channel阻塞
- Oracle 12c PDB中碰到的DG问题 (r10笔记第63天)
- 上线必备 | 高性能ES5.X部署配置清单
- 【Go 语言社区】go 学习中遇到一些语法问题
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- 当12C PDB遇上JDBC (r10笔记第59天)
- 微信公众平台开发获取用户基本信息--转
- Elasticsearch检索分类深入详解—基础篇
- 通过Java程序测试数据库连接信息 (r10笔记第64天)
- GoldenGate安装简记(r10笔记第78天)
- 【Go 语言社区】各种变量的声明
- 【Go 语言社区】Golang 高效字符串拼接
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
- Android中protobuf的使用
- 疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
- Android配置文件操作模块封装,全互联网最简单好用的封装
- 使用logcat让Android应用支持查看实时日志并输出至界面显示功能
- 如何处理redis集群的hot key和big key
- 嵌入式linux之go语言开发(十一)让web服务器跑在终端上,通过网页配置终端参数
- 嵌入式linux之go语言开发(十二)参数配置文件存储模块开发
- 嵌入式linux之go语言开发(十三)LittlevGL,漂亮的嵌入式GUI的go语言绑定
- 同事问我MySQL怎么递归查询,我懵逼了...
- RocketMQ学习四-生产者producer
- 想有自己的博客吗?浏览器支持 MarkDown和语法高亮的最简单示例(使用markdown-it、highlight.js和mermaid)
- Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog
- RocketMQ学习5
- c语言调用go封装的动态库步骤及减小体积包的方法