auth 模块——Django自带的用户认证模块
auth 模块
模块的导入
from django.contrib import auth
auth 模块自带的用户认证模块
auth模块自带了一个认证模块,即验证用户名以及密码是否正确!如下:
user = authenticate(username = "username", password="password")
返回的是布尔值!
login(HTTPRequest,user)
该函数接受一个httpreuqest函数,以及一个经过认证的user对象。
本质上后端为该用户生成相关的session数据。
可以通过
user_obj = auth.login
得到一个login对象,这个对象就可以通过“.username”等方法得到相关user的信息!
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST.get("username")
password = request.POST.get("password")
user_obj = authenticate(username = "username", password="password")
if user:
login(request, user_obj)
# 登录成功,返回需要的文件或者网页
else:
# 登录校验失败,返回login
注意:只要使用login(reuqest, user_obj)之后,reuqest.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。
logout(request)——注销
该函数接受一个HttpRequest对象,无返回值!
from django.contrib.auth import logout
def logout_view(request):
logout(reuqest)
is_authenticated()——判断当前请求是否通过了认证
def my_view(reuqest):
if not reuqest.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
login_reuqest()——装饰器实现登录校验
from django.contrib.auth.decorators import login_required
@login_required
# 装饰器校验登录事件
def my_view(request):
...
如果用户没有登录成功则会跳转到Django默认的登录URL ‘/accounts/login/’ 并传递当前访问的URL的绝对路径(登录成功后会重定向到该路径)
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
如下:
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
create_user()——提供一个创建普通用户的方法
这里提供必要的参数(request、password)
from django.contrib.auth.models import User
user_obj = User.object.create_user(username='用户名',password='密码',enail='邮箱',...)
create_superuser()——创建一个超级用户
from django.contrib.auth.models import User
user_obj = User.object.create_superuser(username='用户名',password='密码',enail='邮箱',...)
check_password(raw_password)——校验密码是否正确
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
返回布尔值
用法:
OK = user_obj.check_password('密码')
或者直接针对当前请求的user对象校验原始密码是否正确(大多用于用户修改密码的时候校验秘密!)
ok = reuqest.user.check_password(raw_password='原始密码')
set_password(raw_password)——修改密码
接受要修改的密码座位参数
注意:设置完对象一定要保存save()
user_obj.set_password('新密码')
user_obj.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)
修改密码示例
用户对象的属性auth
user_obj 能够拿到认证所有用户表的数据属性,比如username,password等。
这个对象还具有一些其他的属性:(如下)
is_staff:用户是否拥有网站的管理权限
is_active:是否允许用户登录,设置为false,可以在不删除该用户的情况下禁止该用户登录!
扩展默认的auth_user表
我们能看到这么好用的Django自带的user表里面的字段是不完全满足我们的需求的,所以我们可以通过类的继承的方法来扩展Django里面user表字段!
继承内置的 “AbstractUser”类,来自定义一个Model类。方法如下:
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 此时就继承了原来的user表里面的所有方法和信息,只是以后再调用的时候就需要命名userinfo了!
"""
需要新增的用户信息表
"""
def __str__(self):
return self.username
注意:——按照上面的方法扩展了auth_user表之后,一定要在settings.py中告诉Django现在使用我新定义的userinfo表来做用户认证。如下
AUTH_USER_MODEL="app01.UserInfo"
此时创建新用户:
UserInfo.object.creat_user(username = "username", password = "password")
创建超级用户:
UserInfo.object.creat_superuser(username = "username", password = "password")
人生苦短,我学python!
再次注意:一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。