Django——用户认证
Django——用户认证
用户与Authentication(身份验证)
Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话。 这个系统一般被称为 auth/auth (认证与授权)系统。 这个系统的名称同时也表明了用户常见的两步处理。
- 验证 (认证) 用户是否是他所宣称的用户(一般通过查询数据库验证其用户名和密码)
- 验证用户是否拥有执行某种操作的 授权 (通常会通过检查一个权限表来确认)
根据这些需求,Django 认证/授权 系统会包含以下的部分:
- 用户 : 在网站注册的人
- 权限 : 用于标识用户是否可以执行某种操作的二进制(yes/no)标志
- 组 :一种可以将标记和权限应用于多个用户的常用方法
- Messages : 向用户显示队列式的系统消息的常用方法
通过 is_authenticated() 方法来判断一个用户是否已经登录了
if request.user.is_authenticated():
# Do something for authenticated users.
else:
# Do something for anonymous users.
创建用户(创建对象)
创建用户最直接的方法是使用包含 create_user() 的函数
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
更改密码
Django 不会在用户模型里保存原始(明文)密码,而只会存储哈希值(请参阅文档 如何管理密码 documentation of how passwords are managed ) 。因此,请不要试图直接操作用户的密码,这就是创建用户需要辅助函数的原因。
1.manage.py changepassword *username* 提供了在命令行修改用户密码的方法。它会提示你输入两次新密码,如果操作成功,新密码就立刻生效。如果你没有提供参数 username ,那么将会尝试修改当前系统用户的密码。
2.在代码里修改密码,使用 set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
如果你已经按照了 Django admin 管理后台,你也可以在管理后台页面修改密码(请参阅authentication system's admin pages)。
Django 还提供了允许用户自行修改密码的` 。
修改密码将会注销用户的所有会话。查看详情请参阅 密码更改时会话失效
使用User对象
User 实例一般从 request.user ,或是其他下面即将要讨论到的方法取得,它有很多属性和方法
AnonymousUser 对象模拟了 部分 的接口,但不是全部,在把它当成真正的user对象 使用前,需要检查一下
User 对象属性
| 属性 | 描述 |
|---|---|
| username | 必须的,不能多于30个字符,仅用字母数字式字符(字母、数字和下划线)。 |
| first_name | 可选; 少于等于30字符。 |
| last_name | 可选; 少于等于30字符。 |
| 可选。 邮件地址。 | |
| password | 必需的。 密码的哈希值(Django不储存原始密码)。 |
| is_staff | 布尔值。 用户是否拥有网站的管理权限。 |
| is_active | 布尔值. 设置该账户是否可以登录。 把该标志位置为False而不是直接删除账户。 |
| is_superuser | 布尔值 标识用户是否拥有所有权限,无需显式地权限分配定义。 |
| last_login | 用户上次登录的时间日期。 它被默认设置为当前的日期/时间。 |
| date_joined | 账号被创建的日期时间 当账号被创建时,它被默认设置为当前的日期/时间。 |
user对象方法
| 方法 | 描述 |
|---|---|
| is_authenticated() | 如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。通过认证并不意味着 用户拥有任何权限,甚至也不检查该用户是否处于激活状 态,这只是表明用户成功的通过了认证。 |
| is_anonymous() | 如果是个 AnonymousUser ,返回值为 True , 如果是 User 对象,返回值为 False 。一般来 说, is_authenticated() 会比这个方法更常用些。 |
| get_full_name() | 返回值为: first_name 加上 last_name ,以 空格分隔。 |
| set_password(passwd) | 如果给定的字符串通过了密码检查,返回 True 。 密码比较已进行了哈希处理。 |
| get_group_permissions() | 返回用户通过所属组获得的权限列表 |
| get_all_permissions() | 返回用户通过所属组和用户自身权限所获得的所有权限 列表。 |
| has_perm(perm) | 如果用户拥有给定的权限,返回 True , perm 应形如 " codename" 的格式。如果用户处于 非激活状态,则总是返回 False 。 |
| has_perms(perm_list) | 如果用户拥有所有给定的权限,返回 True 。 如果用户处于非激活状态,则总是返回 False |
| has_module_perms(app_label) | 如果用户拥有任何给定 app_label 的权限,返回 True 。如果用户处于非激活状态,则总是返回 False |
| get_and_delete_messages() | 返回用户的 Message 对象列表,并从队列中删除。 |
| email_user(subj, msg) | 给用户发送电子邮件,用 DEFAULT_FROM_EMAIL 的设 置作为发件人。也可以用第3个参数 from_email 来 覆盖设置。 |
| get_profile() | 返回用户的网站自定义profile |
权限和认证
User 对象有两个多对多的属性: groups 和 permissions 。 User 对象可以 象使用其他多对多属性的方法一样使用它们。
# Set a user's groups:
myuser.groups = group_list
myuser.groups.set([group_list])
# Add a user to some groups:
myuser.groups.add(group1, group2,...)
# Remove a user from some groups:
myuser.groups.remove(group1, group2,...)
# Remove a user from all groups:
myuser.groups.clear()
# Permissions work the same way
myuser.permissions = permission_list
myuser.permissions.add(permission1, permission2, ...) myuser.permissions.remove(permission1, permission2, ...)
myuser.permissions.clear()
登录和退出(验证用户)
Django 提供内置的视图(view)函数用于处理登录和退出 ,但在开始前,我们来看看如何手工登录和退出,Django 在 django.contrib.auth 中提供了两个函数来处理这些事情—— authenticate() 和 login()
使用 authenticate() 来验证用户。它使用 username 和 password 作为参数来验证,对每个身份验证后端( authentication backend )进行检查。如果后端验证有效,则返回一个 :class:~django.contrib.auth.models.User 对象。如果后端引发 PermissionDenied 错误,将返回 None。举例
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials
authenticate() 只是验证一个用户的证书而已。而要登录一个用户,使用 login() 。该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中。
from django.contrib import auth
def login(request):
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password) #验证成功:一个User实例
if user is not None and user.is_active:
# Correct password, and the user is marked "active"
auth.login(request, user)
# Redirect to a success page.
return redirect("/account/loggedin/")
else:
# Show an error page
return redirect("/account/invalid/")
注销一个用户,在你的视图中使用 django.contrib.auth.logout() 。该函数接受一个 HttpRequest 对象作为参数,没有返回值。
from django.contrib import auth
def logout(request):
auth.logout(request)
# Redirect to a success page.
return redirect("/account/loggedout/")
#注意,即使用户没有登录, logout() 也不会抛出任何异常。
Django——用户认证的更多相关文章
- [django]用户认证中只允许登陆用户访问(网页安全问题)
当设计一个重要网页时,一般要求未从登陆界面访问的用户不能进入其他页面,那么需要如何设置呢? 如下 django中的url.py urlpatterns = [ url(r'^$', 'login ...
- Django 用户认证及OneToOneField
Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- “Django用户认证系统”学习资料收集
首推追梦人物——Django用户认证系统 待续……
- Django 2.0 学习(17):Django 用户认证(auth模块)
Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
- django用户认证系统——修改密码6
再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——基本设置1
网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...
随机推荐
- 解决<c:if>无else的问题
之前发了一个jstl的if标签博客,说是jsp没有提供<c:else>标签.于是有大佬评论,说<c:choose></c:choose>可以解决,通过查资料和敲代码 ...
- BZOJ 3309: DZY Loves Math 莫比乌斯反演+打表
有一个神奇的技巧——打表 code: #include <bits/stdc++.h> #define N 10000007 #define ll long long #define se ...
- CSS块元素
一.典型代表: Div h1-h6 p ul li 二.特点: 独占一行 可以设置宽高 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认一致. <style type=" ...
- ubuntu编译PCRE时出现 line 81: aclocal-1.14: command not found错误
WARNING: 'aclocal-1.14' is missing on your system. You should only need it if you modified 'acinclud ...
- 从Word到Latex文档
有时,从Word文档复制到Latex文档时会编译报错,这时要检查某些特殊字符.中文输入法下的字符有时无法正确编译,要用相应的英文输入法下的字符替代.拉丁字母.希腊字母应该用转义字符实现.
- GDOI2018 小学生图论题 [NTT]
并没有传送门qwq 思路 首先要知道一个结论(或者说是一个套路):一个竞赛图缩点之后必定是一条链. 那么强联通分量的个数,就是这条链的边数+1. 考虑一条边什么时候会出现:当且仅当点集可以被分成\(S ...
- kube-promethues监控告警详解(邮件、钉钉、微信、自研平台)
Alertmanager已经在前面Prometheus初体验(三)已经介绍过了.现在介绍一下在kube-promethues里面怎么修改alertmanager配置文件,以及怎么通过各种媒介发送信息. ...
- Win7下安装VS2017、安装Qt5.10.1以及在VS2017添加qt插件
一.安装VS2017 1.下载VS2017 进入vs下载官网https://www.visualstudio.com/zh-hans/downloads/,选择所需要的vs版本,进行在线安装. 2.安 ...
- Ubuntu 16.04与Win10双系统双硬盘安装图解
一.先做准备工作.建议:在当前系统所在的硬盘上,留一片空的主分区安装Ubuntu系统. 2.划分多大的空间够?安装的过程中需要涉及到分区,为了以免日后重装,我的建议是如下分区:1).5G,主分区,空间 ...
- typescript - 9.装饰器
装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常见的装 ...