Django 用户认证系统使用总结
Django用户认证系统使用总结
by:授客 QQ:1033553122
测试环境
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/
Django 用户认证系统使用总结的更多相关文章
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- “Django用户认证系统”学习资料收集
首推追梦人物——Django用户认证系统 待续……
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
- django用户认证系统——修改密码6
再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——基本设置1
网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...
- django用户认证系统——登录4
用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...
- D django 用户认证系统
django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...
- Django用户认证系统(二)Web请求中的认证
在每个Web请求中都提供一个 request.user 属性来表示当前用户.如果当前用户未登录,则该属性为AnonymousUser的一个实例,反之,则是一个User实例. 你可以通过is_authe ...
- Django用户认证系统(一)User对象
User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类,例如超级用户('superuser ...
随机推荐
- 记一次U8的插件开发
在u8上开发一个winform的插件用来实现不同账套之间的单据协同,使用的方法是用存储过程走数据库.因为原账套的数据量会很大,如果直接在插件上用单线程传输,那肯定会造成传输过程,u8卡死的.一种方法是 ...
- Vue.js条件渲染与列表渲染指南
title: Vue.js条件渲染与列表渲染指南 date: 2024/5/26 20:11:49 updated: 2024/5/26 20:11:49 categories: 前端开发 tags: ...
- Django——Media配置
settings.py中的配置: MEDIA_ROOT 和 MEDIA_URL MEDIA_ROOT 是指:用户上传文件的根路径 --> MEDIA_ROOT = os.path.join(BA ...
- 谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!
前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点.所以以下我站在C# 的角度,来写一个简单的Demo,用来演示C# 实现的简单小爬虫. ...
- kubernetes的三种探针startupprobe,ReadinessProbe,LivenessProbe记录
kubernetes的三种探针 startupprobe: k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startuprobe,就会先禁用其他的探测,直到它成功为 ...
- svg动画导致持续占用CPU
1.在一次性能优化中突然发现一个svg矢量图动画导致CPU持续占用的问题,该svg在web中使用, 即使webview释放之后,CPU依然占用达到10%,6s+上测试结果 svg如下所示: <s ...
- 一文了解JVM面试篇(上)
Java内存区域 1.如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存.内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存 ...
- k8s——deployment
创建deployment [root@master deploy]# kubectl create deploy nginx-deploy --image=nginx:1.7.9 deployment ...
- LeetCode 680. Valid Palindrome II 验证回文字符串 Ⅱ(C++/Java)
题目: Given a non-empty string s, you may delete at most one character. Judge whether you can make it ...
- 喜讯!极限科技再次中标中国移动云 Elasticsearch 自研版技术开发服务项目!
喜讯!极限科技 再次中标 中国移动云 Elasticsearch 自研版技术开发服务项目! 近日,极限科技再次成功中标中国移动苏州研发中心 <云能力中心 2023-2024 年移动云 Elast ...