概要

auth模块是Django提供的标准权限管理系统,可以提供⽤户身份认证, 用户组和权限管理。

auth可以和admin模块配合使⽤, 快速建立网站的管理系统。

在INSTALLED_APPS中添加’django.contrib.auth’使⽤该APP, auth模块默认启⽤。

主要的操作包括:

  • create_user 创建用户
  • authenticate 验证用户是否存在
  • login 记住⽤户的登录状态
  • logout 退出登录
  • is_authenticated 判断⽤户是否登录
  • @login_required 判断⽤户是否登录的装饰器

前期配置

说明

Django 在新建⼯程时已经为使用用户认证系统做好了全部必要的配置。不过有可能你并非使用django-admin 命令新建的⼯程,或者你使用的是⼀个正在开发中的项目,因此最好再检查⼀下 settings.py ⽂件中是否已经做好了全部必要配置。

配置

  1. 在setting.py的INSTALLED_APPS
1
2
3
4
5
INSTALLED_APPS = [
'django.contrib.auth',
# ⽤户权限处理部分依赖的应⽤
'django.contrib.contenttypes',
]
  1. 在setting.py的MIDDLEWARE
1
2
3
4
5
6
MIDDLEWARE = [
# 会话⽀持中间件
'django.contrib.sessions.middleware.SessionMiddleware',
# 认证⽀持中间件
'django.contrib.auth.middleware.AuthenticationMiddleware',
]

注意

为了让 Django 用户认证系统使⽤我们⾃定义的⽤户模型,必须在 settings.py ⾥通过 AUTH_USER_MODEL 指定⾃定义⽤户模型所在的位置

1
AUTH_USER_MODEL = 'app名字.User'

User对象

user对象重要属性

  • User 对象属性:username, password(必填项)password⽤哈希算法保 存到数据库
  • is_staff : ⽤户是否拥有⽹站的管理权限
  • is_active : 是否允许⽤户登录, 设置为 False ,可以不⽤删除⽤户来禁⽌ ⽤户 登录

拓展 User 模型

  • 说明

⽤户可能还包含有头像、昵称、介绍等等其它属性,因此仅仅使⽤ Django 内 置的 User 模型是不够。所有有些时候我们必须使⽤在系统的User上进⾏拓展

  • 继承AbstractUser

在应用下的models.py导入AbstractUser模型:

1
from django.contrib.auth.models import AbstractUser

继承后自定义字段:

1
2
3
4
5
6
class User(AbstractUser):
sex = models.BooleanField(default=False)
phone = models.CharField(max_length=12, null=True, verbose_name="手机号")

class Meta:
db_table = "user"

迁移

定义完模型都需要迁移数据库:

1
2
python manage.py makemigrations
python manage.py migrate

常用操作代码

注册

  1. 说明 当⽤户注册的时候⽤ create_user(username,password,email) 默认情况 下 is_active=True,is_staff=False,is_superuser=False 。 底层将password⽤hash算法加密之后存储到数据库中

  2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
# 注册
data = form.cleaned_data
print(data)
user = User.objects.create_user(**data)
if user:
return HttpResponse('注册成功')
else:
return HttpResponse('注册失败')
else:
return render(request, 'register.html', {'form': form})
return render(request, 'register.html')

登录

当⽤户登录的时候⽤ authenticate(username=username,password=password) 验 证⽤户是否登录,如果数据库中存在⽤户输⼊的账号和密码,返回⼀个user对 象,否则返回None。底层将password⽤hash算法加密后和数据库中 password进⾏对⽐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def user_login(request):
if request.method=='POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
# 使用Django的用户系统验证,如果用户存在返回User对象,否则返回None
user = authenticate(request, username=username, password=password)
if user:
print(user.username)
# 调用login来记录登录状态,框架给某个已认证的⽤户附加上session id等信信息
login(request, user)
return HttpResponse('欢迎用户:{}'.format(user.username))
else:
return HttpResponse('登录失败')
return render(request, 'login.html')

首页

1
2
3
4
5
6
7
8
def index(request):
# 获取当前登录的用户名
username = request.user
# 获取登录状态,登录为True,未登录位False
islogin = request.user.is_authenticated
if islogin:
return HttpResponse("欢迎 {} 登录系统".format(username))
return redirect(reverse("App:user_login"))

登出

1
2
3
4
def user_logout(request):
# 登出操作很简单,只要调用logout即可,参数是请求对象
logout(request)
return redirect(reverse("App:user_login"))

路由保护

@login_required装饰器能验证是否登录,有一个login_url参数,指定未登录跳转到那个页面。

1
2
3
@login_required(login_url='/login/')
def publish(request):
return HttpResponse('发布文章')

修改密码

使用Django的用户认证模块修改密码只能调用set_password来进行更改。

1
2
3
4
5
6
7
@login_required(login_url='/login/')
def chenge(request):
id = request.user.id
users = User.objects.get(pk=id)
users.set_password("12345678") # 新密码
users.save()
return HttpResponse('OK')

Django签名

1
2
3
4
5
6
7
8
9
10
11
from django.contrib.auth.hashers import make_password, check_password
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def index(request):
hash = make_password('admin') # 调用该函数返回一个Django内置签名算法的hash
print(hash)
res = check_password('admin', hash) # 调用该函数验证hash
print(res)
return HttpResponse("OK")