用户认证组件

用户认证

auth模块

    用户姓名,密码等信息存储在auth_user表中,其中表中存放的密码为用哈希算法得到的密文

模块导入

from django.contrib import auth

request.user

    如果在此之前浏览器成功登录该页面,则request.user代表登录对象

    如果在此之前浏览器未登录或登录页面不成功,则request.user代表默认匿名对象AnonymousUser。该对象里id,username属性值为None

方法:

1. authenticate()

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

    如果认证信息有效,则返回一个User对象。否则返回None

    当我们试图登录一个从数据库中直接取出来不经过authenticate()的User对象,则会报错

user_obj = auth.authenticate(username='someone', password='somepassword')

2. login(request, user)

    该函数接受一个HttpRequest对象,以及一个认证了的User对象

    调用该函数,执行了两个功能:

1) 注入session信息:request.session["user_id"] = user_obj.pk

2) request.user = user_obj

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_obj:
        login(request, user_obj)
        # Redirect to a success page.
        ...
    else:
        # Return an "invalid login" error message
        ...

3. logout(request)

    注销用户

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

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

def logout_view(request):
    auth.logout(request)
    # Redirect to a success page

User对象

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

User对象的is_authenticated()

    如果是真正的User对象,返回值为True

    用于检查用户是否已经通过了认证

    通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证

    后台可以用request.user.is_authenticated()判断用户是否已经登录,如果为True则可以向前台展示request.user.name

@login_required() 装饰器

    若用户没有登录就访问需要登录后才能访问的页面,则会先跳转到django默认的登录URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问的url的绝对路径,在登录成功后,会重定向到该路径。

@login_required()导入

from django.contrib.auth.decorators import login_required
"""
要求:
1. 用户在没有登录情况下访问index,order页面,先跳到登录页面
2. 用户在登录界面完成登录后,自动跳回之前访问的页面
"""
from django.shortcuts import render, HttpResponse, redirect

# Create your views here.
from django.contrib import auth
from django.contrib.auth.decorators import login_required


def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        user_obj = auth.authenticate(username=user, password=pwd)

        if user_obj:
            auth.login(request, user_obj)
            path = request.GET.get("next") or "/index/"    # 获取访问页面路径
            return redirect(path)
        else:
            return redirect("/login/")


@ login_required
def index(request):
    return render(request, "index.html")


@ login_required
def order(request):
    return render(request, "order.html")


def logout(request):
    auth.logout(request)
    return redirect("/login/")
示例

创建用户

User导入

from django.contrib.auth.models import User

创建超级用户

User.objects.create_superuser(username="someone", password="somepassword")

创建普通用户

User.objects.create(username="someone", password="somepassword")       # 密码为明文
User.objects.create_user(username="someone", password="somepassword")  # 密码为密文

 修改密码

user = User.objects.get(username="someone")
user.set_password(password="password")
user.save

check_password(password)

    检查密码

    用户需要修改密码的时候,首先要让他输入原来的密码,如果给定的字符串通过了密码检查,返回True

 

posted @ 2019-01-11 22:40  Ethan_Y  阅读(107)  评论(0编辑  收藏  举报