内建系统简介
Django 自带一个用户验证系统,它负责处理用户账号、组、权限和基于cookie的用户会话。
- django.contrib.auth 认证的应用
- auth.models.User 用户模型类,处理注册、登录等;
- auth.models.Group 组模型类,对用户分组,与User是多对多关系;
- auth.models.Permission 权限模型类,标识某个用户是否有权限操作,与User是多对多关系;
- user_obj.user_permissions 是与权限的多对多关联字段
- user_obj.user_permissions.add(perm_obj) 为用户添加权限(也可以通过superuser在管理后台为一个用户添加权限)
- user_obj.user_permissions.create(name=“权限名称”, codename=“users.add_userarticle”, content_type=content_type_obj) 添加权限;
- user_obj.user_permissions.all() 查询所有的权限;
- user_obj.user_permissions.clear() 清空所有的权限;
- user_obj.groups 是用户与组的多对多关联字段
- user_obj.groups.add(group_obj) 将用户添加到一个组;
- user_obj.groups.all() 查询用户所在的组;
- user_obj.groups.clear() 清空组
- auth -> authenticate 认证用户的登录
- 认证成功返回用户对象,否则返回None
- auth -> login 让用户登录,并基于session进行会话保持;
- auth -> logout 退出登录;
- auth.decorators.login_required 装饰器,只装饰视图函数,限制需要登录才可以访问
- 若未登录,则重定向到(settings.py配置文件中的)LOGIN_URL 地址,也可以指定login_url参数;
- redirect_field_name参数 默认为‘next’
- auth.decorators.permission_required 装饰器, 装饰视图函数,限制即使登录后也需要相应的权限,才可以操作
- perm or perms 参数,表示需要的权限,如“add_userarticle”、[“add_userarticle”, “change_userarticle”, ‘view_userarticle’, ‘delete_userarticle’]。 这里的权限都是app_name.add_模型类小写形式
- raise_exception, False 时,若无权限则重定向到LOGIN_URL(也可以用login_url参数指定);True时,若无权限则服务端抛出一个PermissionDenied异常,并返回403
- auth.decorators.user_passes_test 装饰器,装饰视图函数,测试用户是否可以正常访问
- @user_passes_test(func) 装饰视图函数,其中func是自定义函数 def func(user),内部判断user对象是否合法,合法返回True,否则返回False(重定向到登录页面)
auth认证的表
模型类完成迁移后,在数据库中默认有若干表。
auth_user表,存储用户;
auth_permission表,存储所有模型类的增add、删delete、改change、查view权限
auth_group表,存储用户的组
django_content_type表,将模型类与权限关联
django_migrations表,模型类迁移历史表,删除相关历史后,可以重新执行迁移,而不用删除数据库。
注册时创建用户
- 直接使用内建的User模型类创建用户对象;
- 自定义一个User模型类,继承内建的auth.models.AbstractUser,此时可以扩展字段;
#auth 内建的应用
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# username/password/email/is_superuser/is_active等属性 直接继承父类
class Meta:
db_table = "user_table" # 数据库中的表名
verbose_name_plural = 'user' # 管理后台展示的名称
创建普通用户
直接使用内建的模型类User
# objects 对象管理器 方式
from django.contrib.auth.models import User
user = User.objects.create_user(username="lauf", password="123", email="xxx", is_active=True, is_superuser=False)
# 以上会对密码,自动加密;而实例化方式不会自动加密
# username必须唯一,自己验证处理或异常捕获
# user.is_active = True # 控制伪删除
# 保存到default 数据库
user.save() # 若要保存到(配置的)其他数据库,则使用using='primary'关键字参数
# 实例化方式
user2 = User(username="tom", password="tom123", email="xxxx", is_active=True, is_superuser=False)
# 数据库中的密码是明文,并没有加密
# user2.set_password("tom123") # 可以哈希加密
user2.save()
创建超级用户
# 导入User
from django.contrib.auth.models import User
superuser = User.objects.create_superuser(username="lauf", password="123", email="xxxx")
# 必须有email
superuser.save()
用户均保存在auth_user表中
登录时验证用户
from djang.contrib.auth import authenticate
#验证用户名、密码,直接传入字符串
user = authenticate(request, username=username, password=password)
if user: # 验证成功,返回user对象,否则返回None
return HttpResponse("登录成功")
else:
return HttpResponse("用户名或密码错误")
修改密码
user = User.objects.get(username="lauf") # 注意异常捕获 (只能查询到一条数据,多或者少都异常)
user.password = "456" # 数据库中保存 456
#
user.set_password("456") # 数据库中保存 哈希加密
user.save()
登录会话保持
from django.contrib.auth import authenticate, login, logout
def deal_login(request):
username = request.POST.get("username") # str
password = request.POST.get("password") # str
#验证user
user = authenticate(username=username, password=password)
if user: #验证通过,让其登录
#登录,并会话保持,默认使用session保持会话
login(request, user)
#
return HttpResponse("登录成功")
else:
return HttpResponse("用户名或密码错误")
# 需要登录才能访问的视图
from django.contrib.auth.decorators import login_required
@login_required #必须登录才可以进入视图,否则重定向 settings> LOGIN_URL="/login"
def index_view(request):
# 处理业务
# 获取登录认证的用户
login_user = request.user # 未登录的user 为 AnonymousUser 通过.is_authenticated区分
return HttpResponse("xxxx")
退出登录
def logout_view(request):
logout(request)
return HttpResponse("已退出")
实战案例
- 注册功能
路由:/user/reg
视图: reg_view
GET,返回注册页面
POST,使用内建的认证系统,创建用户 - 登录功能
路由:/user/login
视图:login_view
使用内建的认证系统 --验证用户,并登录保持 - 登出
路由:/user/logout
视图:logout_view
用户登出 - 首页功能
路由:/index
视图:index_view
必须登录,才可以显示主页
项目代码
提取码:qidi