Django用户认证系统使用总结

by:授客 QQ1033553122

测试环境

Win7

Django 1.11

 

使用Django认证系统

本文按默认配置讲解Django认证系统的用法。如果默认的认证无法满足项目,Django提供了对认证系统的扩展与定制。

Django身份验证同时提供身份验证和授权,通常称为身份验证系统,因为这些特性有些耦合。

用户对象

默认user对象主要属性:

  • username
  • password
  • email
  • 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关键词参数,默认情况为usernamepassword。如果认证通过,则返回对应的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(requestuserbackend=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 用户认证系统使用总结的更多相关文章

  1. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  2. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  3. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  4. django用户认证系统——修改密码6

    再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...

  5. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  6. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  7. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  8. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

  9. Django用户认证系统(二)Web请求中的认证

    在每个Web请求中都提供一个 request.user 属性来表示当前用户.如果当前用户未登录,则该属性为AnonymousUser的一个实例,反之,则是一个User实例. 你可以通过is_authe ...

  10. Django用户认证系统(一)User对象

    User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类,例如超级用户('superuser ...

随机推荐

  1. MFC之多字节和宽字节的总结

    ANSI字符集  所支持的就是多字节的也叫窄字节,类型来说就对应char类型.Unicode字符集 也叫宽字符集 所支持的就是宽字符集,从类型上来说就是 wchar_t类型.gb2312是中国的编码, ...

  2. 牛逼!50.3K Star!一个自动将屏幕截图转换为代码的开源工具

    1.背景 在当今快节奏的软件开发环境中,设计师与开发者之间的协同工作显得尤为重要.然而,理解并准确实现设计稿的意图常常需要耗费大量的时间和沟通成本.为此,开源社区中出现了一个引人注目的项目--scre ...

  3. QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

    前言   使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车.无人船.无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇: 上半部分:主要是安装好后,使用QtC ...

  4. VMware Ubuntu虚拟机打开报错问题

    问题描述 昨天虚拟机卡死,我把VMware Workstation的进程用任务管理器杀掉了,今天重新打开虚拟机却发现以下报错 报错内容 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘" ...

  5. else if

      // if(){}else if(){}...else{}         // 多种条件,多种情况下的判断语句         // 必须要注意         // 1,else if 之后有 ...

  6. memo(自带)

    React.memo()是一个高阶函数,它与 React.PureComponent类似,但是一个函数组件而非一个类.如果你的组件在相同 props的情况下渲染相同的结果,那么你可以通过将其包装在 R ...

  7. vue计算属性computed

    模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板变得简洁易于维护.计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变 ...

  8. cerebro安装部署,es客户端优化界面

    1.下载地址 https://github.com/lmenezes/cerebro/releases 2.下载cerebro-0.9.3.zip 运行bin/cerebro ,启动没有报错,并且命令 ...

  9. 通俗理解GAN -- 基础认知

    Smiling & Weeping ---- 你已春风摇曳,我仍一身旧雪 1.GAN的基本思想 GAN全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是一种对抗博弈状态中的.下面我们举 ...

  10. 实现 Emlog 最新评论列表不显示博主的评论回复

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 实现 Emlog 最新评论列表不显示博主的评论回复 日期: ...