Auth认证模块

发布时间 2023-03-24 23:47:09作者: 猿小姜

Auth模块是什么

Auth模块是django自带的用户认证模块

在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表( django_session auth_user )

django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表(必须是管理员用户才能进入)

创建超级用户(管理员用户) python3 manage.py createsuperuser

Auth模块常用方法

authenticate()

提供了用户认证功能,即验证用户名及密码是否正确,一般需要username、password两个关键字参数。

如果认证成功(用户名和密码有效),便会返回一个User对象。

authenticate()会在User对象上设置一个属性来表示后端已经认证了该用户,且信息在后面的过程中是需要的。

user_obj = auth.authenticate(request,username=username,password=password)
# 括号内必须同时传入用户名和密码
print(user_obj)  # 用户对象  yuanxiaojiang  数据不符合则报错
print(user_obj.username)  # yuanxiaojiang
print(user_obj.password)  # 密文  pbkdf2_sha256$260000$A8AB1kLbRTFaA2wiC03Tle$FRxhnza/VdZVRhx4FxL6xcutGjBZis1l5q9h0yyglVQ=

 

login(HttpRequest,user)

该函数接受一个HttpRequest对象,一个经过认证的User对象。

该函数实现一个用户登陆的功能。本质上会在后端为该用户生成session数据。

# 判断当前用户是否存在
if user_obj:
    # 保存用户状态
    # 执行了该方法,就可以在任何地方通过request.user获取当前登陆的用户对象
    auth.login(request,user_obj)  # 类似于request.session[key] = user_obj
    """
    1.自动查找auth_user标签
    2.自动给密码加密再比对
      该方法注意事项
        括号内必须同时传入用户名和密码
    """

logout(request)

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

用法:

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  # Redirect to a success page.

is_authenticated()

用来判断当前请求是否通过了认证。

用法:

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd()

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

用法:

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()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

create_superuser()

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

check_password(password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

用法:

ok = user.check_password('密码')

set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

用法:

user.set_password(password='')
user.save()
 一个修改密码的简单示例

User对象的属性

User对象属性:username, password

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

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    # 登录功能
    re_path(r'^login/', views.login),
    # 校验用户是否登陆
    re_path(r'^home/', views.home),
    re_path(r'^index/',views.index),
    # 修改密码
    re_path(r'^set_password/',views.set_password),
    # 注销功能
    re_path(r'^logout/',views.logout),
    # 注册功能
    re_path(r'^register/',views.register),
]
urls.py

 

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth
# Create your views here.


"""
使用auth模块要用就用全套
"""

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去用户表中校验数据
        # 1.表如何获取
        # 2.密码如何比对
        user_obj = auth.authenticate(request,username=username,password=password)
        # print(user_obj)  # 用户对象  jason   数据不符合则返回None
        # print(user_obj.username)  # jason
        # print(user_obj.password)  # pbkdf2_sha256$36000$zeNDf8CkZj7y$b+e/CjzZoAnbBIpvUWgz25ybBDqDzRTmYAHPytxqRYQ=
        # 判断当前用户是否存在
        if user_obj:
            # 保存用户状态
            auth.login(request,user_obj)  # 类似于request.session[key] = user_obj
            # 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象
            return redirect('/home/')
        """
        1.自动查找auth_user标签
        2.自动给密码加密再比对
        该方法注意事项
            括号内必须同时传入用户名和密码
            不能只传用户名(一步就帮你筛选出用户对象)
        """
    return render(request,'login.html')


from django.contrib.auth.decorators import login_required


# @login_required(login_url='/login/')  # 局部配置:用户没有登陆跳转到login_user后面指定的网址
# @login_required  # 全局配置
# @login_required(login_url='/xxx/')  # 优先级  局部 > 全局
@login_required
def home(request):
    """用户登陆之后才能看home"""
    print(request.user)  # 用户对象     AnonymousUser匿名用户
    # 判断用户是否登陆
    print(request.user.is_authenticated())
    # 自动去django_session里面查找对应的用户对象给你封装到request.user中
    return HttpResponse('home')

"""
1.如果局部和全局都有 该听谁的?
    局部 > 全局
2.局部和全局哪个好呢?
    全局的好处在于无需重复写代码 但是跳转的页面却很单一
    局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
"""
# @login_required(login_url='/login/')
@login_required
def index(request):
    return HttpResponse('index')


@login_required
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        # 先校验两次密码是否一致
        if new_password == confirm_password:
            # 校验老密码对不对
            is_right = request.user.check_password(old_password)  # 自己加码比对密码
            if is_right:
                # 修改密码
                request.user.set_password(new_password)  # 仅仅是在修改对象的属性
                request.user.save()  # 这一步才是真正的操作数据库
        return redirect('/login/')

    return render(request,'set_password.html',locals())


@login_required
def logout(request):
    auth.logout(request)  # 类似于request.session.flush()
    return redirect('/login/')
from app01 import models

from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 操作auth_user表写入数据
        # User.objects.create(username=username,password=password)  # 写入数据  不能用create 密码没有加密处理
        # 创建普通用户
        # User.objects.create_user(username=username,password=password)
        # 创建超级用户(了解):使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
        User.objects.create_superuser(username=username,email='123@qq.com',password=password)
    return render(request,'register.html')
views.py
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
</body>
login.html
<body>
<form action="" method="post">
    {% csrf_token %}
    <h1>注册</h1>
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
</body>
register.heml
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p>
    <p>old_password:<input type="text" name="old_password"></p>
    <p>new_password:<input type="text" name="new_password"></p>
    <p>confirm_password:<input type="text" name="confirm_password"></p>
    <input type="submit">
</form>
</body>
set_password.html