f、⽤户认证系统

⽤户认证系统

⼀、概要

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

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

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

主要的操作包括:

  1. create_user 创建用户
  2. authenticate 验证登录
  3. login 记住用户的登录状态
  4. logout 退出登录
  5. is_authenticated 判断用户是否登录
  6. @login_required 判断用户是否登录的装饰器

⼆、前期配置

1、说明

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

2、配置

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

三、User对象

1、user对象

  1. 属性
字段 说明 备注
username 少于等于30个字符。 用户名可以包含字母数字、_、@、+、.和- 字符 必 选
password 密码的哈希及元数据。(Django不保存原始密码)。原始密码可以无限长而且可以包含任意字符。参见密码相关的⽂档 必 选
is_active 布尔值。指示用户的账号是否激活,缺省值 为True 必 选
first_name 少于等于30个字符 可 选
last_name 少于30个字符 可 选
email 邮箱地址 可 选
groups 与Group 之间的多对多关系 可 选
user_permissions 与Permission 之间的多对多关系 可 选
is_staff 布尔值。指示用户是否可以访问Admin 站点 可 选
is_superuser 布尔值。只是这个⽤户拥有所有的权限而不需要给他们分配明确的权限。 可 选
last_login 用户最后⼀次登录的时间 默 认 值
date_joined 账户创建的时间。当账号创建时,默认设置为当前的date/time 默 认 值
  1. 说明

    User 对象属性:username, password(必填项)password用哈希算法保存到数据库

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为False ,可以不用删除用户来禁止用户登录

2、拓展 User 模型

2.1、说明

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

2.2、继承AbstractUser

  1. 说明

    推荐方式: django.contrib.auth.models.User 也是继承自 AbstractUser 抽象基类,而且仅仅就是继承了 AbstractUser ,没有对 AbstractUser 做任何的拓展

  2. 在app的models.py中

    class User(AbstractUser): 
        phone = models.CharField(max_length=12, null=True,verbose_name="⼿机号")
        
        class Meta(AbstractUser.Meta):
            db_table='user
    
  3. 注意

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

   AUTH_USER_MODEL = 'app名字.User'
  1. 迁移

    python manage.py makemigrations
    python manage.py migrate
    

3、常用操作

1、验证登录

  1. 说明

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

  2. 示例代码

    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、注册操作

  1. 说明

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

  2. 示例代码

    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、登录操作

  1. 说明

    当用户登录的时候用 login(request,user) 来记住用户的登录状态,该函数接受⼀个HttpRequest对象,以及⼀个认证了的User对象,此函数使用django的session框架给某个已认证的用户附加上session id等信
    息。

  2. 示例代码

    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、登出操作

  1. 说明

当用户注销的时候用 logout(request) ,只需要⼀个参数request

  1. 示例代码
from django.contrib.auth import logout

def logout_view(request):
    logout(request)

5、修改密码

  1. 说明

  2. 示例代码

    user = auth.authenticate(username=username,password=old_password)
    if user:
        user.set_password(new_password)
        user.save()
    

6、路由保护

  1. 说明

@login_required 修饰器修饰的view函数会先通过session key检查是否登录,已登录用户可以正常的执行操作, 未登录用户将被重定向到login_url指定的位置. 若未指定login_url参数, 则重定向到settings.LOGIN_URL。如果是类视图的话,可以使用LoginRequiredMixin

  1. 示例代码
# 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、验证登录

  1. 说明

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。 通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated判断用户是否已经登录,如果true则可以向前台展示request.user.name

  1. 示例代码
在后台的视图函数⾥可以⽤request.user.is_authenticated判断⽤户是否登录
在前端页面中可以⽤
{% if user.is_authenticated %}
{% endif %}
判断用户是否登录
posted @   昵称已经被使用  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示