Django的认证系统
Django 自带的用户认证系统
一个网站的开发中必不可少的就是用户系统。
Django 内置了强大的用户认证系统——auth, 能够实现用户注册,用户登录,用户认证,修改密码等功能。
命令行创建超级用户
在项目目录下的命令行中执行以下命令可以创建一个超级用户。
python manage.py createsuperuser
然后根据提示进行填写用户名、邮箱地址、密码、重复密码即可创建成功。
auth 模块
Django 的认证系统是通过 auth 模块实现的,导入如下:
from django.contrib import auth
auth 模块提供了多个方法,这些方法实现了用户注册、登录、认证等功能。
authenticate()
-
功能:
用户认证功能,验证用户名和密码是否正确 -
用法:
auth.authenticate(username=username, password=pwd)
-
返回值:
如果验证成功,得到的是一个 User 对象,authenticate() 会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
如果验证失败,得到的是匿名用户。
login(HttpRequest, user)
-
功能:
将验证过的用户 赋值给 request.user 属性 -
用法:
该函数接受一个 HttpRequest 对象,以及一个经过认证的 User 对象。该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关 session 数据。
def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user = auth.authenticate(username=username, password=password) if user: auth.login(request, user) return redirect('/index/') return render(request, "login.html")
logout(request)
-
功能:
用于用户登录后的退出。
-
用法:
接受一个 HttpRequest 对象当调用该函数时,当前请求的 session 信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
def logout(request): auth.logout(request) return redirect("/login/")
is_authenticated()
-
功能:
用来判断当前请求是否通过了认证。
-
用法:
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
-
返回值:
通过认证返回 True, 否则返回 False。
login_requierd
-
功能:
auth 提供的一个装饰器工具,用来快捷的给某个视图含糊添加登录校验。
-
用法:
from django.contrib.auth.decorators import login_required @login_required def index(request): return render(request, "index.html", {"user": request.user})
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
示例:
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
用户表
create_user()
-
功能:
auth 提供的一个创建新用户的方法
-
用法:
必要的参数有用户名 (username) 和密码 (password)
from django.contrib.auth.models import User user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
-
返回值:
返回一个 User 对象
create_superuser()
-
功能:
auth 提供的一个创建新的超级用户的方法
-
用法:
必要的参数有用户名 (username) 和密码 (password)
from django.contrib.auth.models import User user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
-
返回值:
返回一个 User 对象
check_password(password)
-
功能:
检查密码是否正确
-
用法:
需要提供当前请求用户的密码
user.check_password('密码')
-
返回值:
密码正确返回True,否则返回False。
set_password(password)
-
功能:
修改密码的方法
-
用法:
接收 要设置的新密码 作为参数
注意:设置完一定要调用用户对象的save方法!!!
user.set_password(password='') user.save()
一个修改密码功能的简单示例
@login_required
def set_password(request):
user = request.user
err_msg = ''
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
# 检查旧密码是否正确
if user.check_password(old_password):
if not new_password:
err_msg = '新密码不能为空'
elif new_password != repeat_password:
err_msg = '两次密码不一致'
else:
user.set_password(new_password)
user.save()
return redirect("/login/")
else:
err_msg = '原密码输入错误'
content = {
'err_msg': err_msg,
}
return render(request, 'set_password.html', content)
扩展用户表
Django 自带的 auth_user 表固然好用,但是它只有固定的几个字段,在现实项目中,肯定还需要更多的字段。
我们可以通过继承内置的 AbstractUser 类,来定义一个自己的 Model 类。
这样既能根据项目需求灵活的设计用户表,又能使用 Django 强大的认证系统了。
from django.db import models
from django.contrib.auth.models import User, AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=128)
注意:
按上面的方式扩展了内置的 auth_user 表之后,一定要在 settings.py 中告诉 Django,我现在使用我新定义的 UserInfo 表来做用户认证。写法如下:
# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"
再次注意:
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的 auth_user 表了。
参考:https://www.cnblogs.com/liwenzhou/p/9030211.html
GitHub地址:https://github.com/protea-ban/oldboy/tree/master/s9day75/auth_demo