django修身大法之归天心法
用户认证系统
⼀、概要
auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权
限管理。
auth可以和admin模块配合使用, 快速建立网站的管理系统。
在INSTALLED_APPS中添加'django.contrib.auth'使用该APP, auth模块默认启用。
主要的操作包括:
- create_user 创建用户
- authenticate 验证登录
- login 记住用户的登录状态
- logout 退出登录
- is_authenticated 判断用户是否登录
- @login_required 判断用户是否登录的装饰器
⼆、前期配置
1、说明
Django 在新建工程时已经为使用用户认证系统做好了全部必要的配置。不过有可
能你并非使用 django-admin 命令新建的工程,或者你使用的是⼀个正在开发中的
项⽬,因此最好再检查⼀下 settings.py ⽂件中是否已经做好了全部必要配置。
2、配置
- 在setting.py的INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.auth',
# ⽤户权限处理部分依赖的应⽤
'django.contrib.contenttypes',
]
- 在setting.py的MIDDLEWARE
MIDDLEWARE = [
# 会话⽀持中间件
'django.contrib.sessions.middleware.SessionMiddleware',
# 认证⽀持中间件
'django.contrib.auth.middleware.AuthenticationMiddleware',
]
三、User对象
1、user对象
- 属性
字段 | 说明 | 备注 |
---|---|---|
username | 少于等于30个字符。 用户名可以包含字母数字、_、@、+、.和- 字符 | 必 选 |
password | 密码的哈希及元数据。(Django 不保存原始 密码)。原始密码可以无限长而且可以包含 任意字符。参见密码相关的⽂档 |
必 选 |
is_active | 布尔值。指示用户的账号是否激活,缺省值 为True |
必 选 |
first_name | 少于等于30个字符 | 可 选 |
last_name | 少于30个字符 | 可 选 |
邮箱地址 | 可 选 |
|
groups | 与Group 之间的多对多关系 | 可 选 |
user_permissions | 与Permission 之间的多对多关系 | 可 选 |
is_staff | 布尔值。指示用户是否可以访问Admin 站点 | 可 选 |
is_superuser | 布尔值。只是这个⽤户拥有所有的权限而不 需要给他们分配明确的权限。 |
可 选 |
last_login | 用户最后⼀次登录的时间 | 默 认 值 |
date_joined | 账户创建的时间。当账号创建时,默认设置 为当前的date/time |
默 认 值 |
-
说明
User 对象属性:username, password(必填项)password用哈希算法保
存到数据库is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False ,可以不用删除用户来禁止用户
登录
2、拓展 User 模型
2.1、说明
用户可能还包含有头像、昵称、介绍等等其它属性,因此仅仅使用 Django 内
置的 User 模型是不够。所有有些时候我们必须使用在系统的User上进行拓展
2.2、继承AbstractUser
-
说明
推荐方式、django.contrib.auth.models.User 也是继承自 AbstractUser 抽
象基类,而且仅仅就是继承了 AbstractUser ,没有对 AbstractUser 做任何
的拓展 -
在app的models.py中
class User(AbstractUser): phone = models.CharField( max_length=12, null=True, verbose_name="⼿机号" ) class Meta(AbstractUser.Meta): db_table='user
-
注意
为了让 Django 用户认证系统使用我们自定义的用户模型,必须在 settings.py
里通过 AUTH_USER_MODEL 指定自定义用户模型所在的位置AUTH_USER_MODEL = 'app名字.User'
-
迁移
python manage.py makemigrations python manage.py migrate
3、常用操作
1、验证登录
-
说明
当用户登录的时候用 **authenticate(username=username,password=password) **验
证用户是否登录,如果数据库中存在用户输⼊的账号和密码,返回⼀个user对
象,否则返回None。底层将password用hash算法加密后和数据库中
password进行对比 -
示例代码
def myauthenticate(request): pwd = request.POST.get("pwd", "") u_name = request.POST.get("u_name", "") if len(pwd) <= 0 or len(u_name) <= 0: return HttpResponse("账号或密码不能为空") else: user = authenticate(username=u_name, password=pwd) if user: return HttpResponse("验证成功") else: return HttpResponse("账号或密码错误")
2、注册操作
-
说明
当用户注册的时候用**create_user(username,password,email) **默认情况
下 is_active=True,is_staff=False,is_superuser=False 。
底层将password用hash算法加密之后存储到数据库中 -
示例代码
def register_view(request): if request.method == 'POST': try: username = request.POST.get('username') password = request.POST.get('password') phone = request.POST.get('phone') email = request.POST.get('email') # 验证⽤户是否存在 user = User.objects.filter(username=username).first() if user: # ⽤户已经存在 return render(request, 'register.html', {'msg': '⽤户名已存在'}) else: # 保存⽤户 User.objects.create_user(username=username, password=password, phone=phone, email=email) return redirect(reverse("App:login")) except Exception as e: return render(request, 'register.html', {'msg': '注册失败'}) else: return render(request, 'register.html')
3、登录操作
-
说明
当用户登录的时候用 login(request,user) 来记住用户的登录状态
该函数接受⼀个HttpRequest对象,以及⼀个认证了的User对象
此函数使用django的session框架给某个已认证的用户附加上session id等信
息。 -
示例代码
def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 验证⽤户是否存在 user = authenticate(request, username=username, password=password) if user: login(request,user) return redirect('/') else: return render(request, 'test/login.html', {'msg': '⽤ 户密码错误'}) else: return render(request, 'login.html')
4、登出操作
- 说明
当用户注销的时候用 logout(request) ,只需要⼀个参数request
-
示例代码
from django.contrib.auth import logout def logout_view(request): logout(request)
5、修改密码
-
说明
-
示例代码
user = auth.authenticate(username=username, password=old_password) if user: user.set_password(new_password) user.save()
6、路由保护
- 说明
@login_required 修饰器修饰的view函数会先通过session key检查是否登录,
已登录用户可以正常的执行操作, 未登录用户将被重定向到login_url指定的位
置. 若未指定login_url参数, 则重定向到settings.LOGIN_URL
如果是类视图的话,可以使用LoginRequiredMixin
-
示例代码
# settings 配置 LOGIN_URL = '/day05/login/' # views @login_required def find_user_info(request): pass @login_required(login_url='/day05/phone/login') def find_user_info(request): pass class UserInfo(LoginRequiredMixin,View): pass
7、验证登录
- 说明
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了
认证。 通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于
激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用
request.user.is_authenticated判断用户是否已经登录,如果true则可以向
前台展示request.user.name
-
示例代码
在后台的视图函数⾥可以⽤request.user.is_authenticated判断⽤户是否登 录 在前端页面中可以⽤ {% if user.is_authenticated %} {% endif %} 判断用户是否登录
文章篇幅有限,具体可参考
https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index.html