auth

1 auth

1 什么是auth模块?

"""
我们在开发一个网站的时候,无可避免的要设计实现用户登录系统。其中,设计到的需求就包括但不限于用户注册,用户登录、用户认证、注销、修改密码等功能。

显而易见,这种重复造轮子的事情,django框架作为一个完美主义者自然会考虑到。它内置了强大的用户认证系统——auth,默认是使用auth_user表来存储用户的数据。
"""

2 auth模块的常用方法

from django.contrib import auth
  • authenticate()
# 验证用户的用户名以及密码是否正确

user_obj = auth.authenticate(
    request,
    username='username',
    password='password',
)
"""
(1)关于参数,括号内必须同时传入用户名以及密码;
(2)数据都符合,返回一个用户对象user_obj,数据不符合则返回None。
(3)可验证加密的password
"""
  • login()
’‘’
保存用户的登录状态信息
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。该函数本质上会在后端为该后端生成相关的session数据。
‘’‘

auth.login(
    request,
    user_obj,
)
"""
(1)其类视于request.session[key] = user_obj;
(2)执行该方法后,会将user_obj对象封装到request.user中:
print(request.user)   # user_obj对象
print(request.user.username)  # jason
print(request.user.password)  # dbj123
"""
  • is_authenticated()
# 用来判断当前的请求是否经过了认证,返回一个布尔值

if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL,request.path,))
  • login_required()
# auth 模块提供的登录认证装饰器

from django.contrib.auth.decorators import login_required # 局部配置 @login_required(login_url='/login/') # 全局配置 在setiings.py中添加一个全局环境变量 LOGIN_URL = '/login/' # 局部配置&全局配置 (1)局部配置的优先级要高于全局配置; (2)全局的好处在于无需写重复的代码,但是跳转的页面单一, 局部的好处是不同的视图函数在用户没有登录的情况下可以跳转到不同的页面。
  • create_user()
# auth提供的创建普通用户的方法,需要提供必要参数username,password

from django.contrib.auth.models import User

user_obj = User.objects.create_user(username='username',password='password',email='email'...)

# 可对密码进行加密
  • create_superuser()
# auth提供的创建超级用户的方法,需要提供必要参数username,password,email

from django.contrib.auth.models import User

user_obj = User.objects.create_superuser(
    username='username',
    password='password',
    email='email',
)
"""
注意:使用代码创建超级用户的时候必须填邮箱,使用命令行创建超级用户的时候可以不填邮箱。

使用命令行创建超级用户
python manage.py createsuperuser
"""
  • check_password()
# 检查用户输入的密码是否正确,返回一个布尔值

is_ok = request.user.check_password(old_password)
  • set_password()
# auth提供的一个修改密码的功能,需要传入新密码作为参数

request.user.set_password(new_password) #仅仅是修改对象的属性
request.user.save()   # 这一步才是操作数据库

"""
一定要记得加上save操作
"""
  • logout()
# auth提供的注销功能,该函数接收一个HttpResponse对象,没有返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错

from django.contrib import auth

def logout(request):
    auth.logout(request)
    return redirect('/login/')

3 user对象属性

user对象属性:username,password

is_staff:用户是否有网站的管理权限(是否是管理员)

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

4 如何拓展auth_user表

1 一对一关系

from django.db import models
# 第一种:一对一关系,不推荐
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')

2 面向对象的继承

'''
(1)在继承AbstractUser类前,没有执行过数据库迁移命令,即auth_user表没有被创建;
(2)继承的类里面不能覆盖AbstractUser类原有字段名称,只扩展额外的字段即可;
(3)在配置文件settings.py中,告诉django使用User_Info替换auth_user:
 AUTH_USER_MODEL = 'app01.UserInfo'  # '应用名.表名'
'''

from django.db import models
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    GENDER_CHOICE = (
        ('male', ''),
        ('female', ''),
        ('secret', '保密'),
    )
    phone = models.CharField(
        max_length=64,
        verbose_name='phone',
        null=False,
    )
    age = models.IntegerField(
        verbose_name='age',
        default=18,
    )
    gender = models.CharField(
        max_length=16,
        choices=GENDER_CHOICE,
        default='secret',
    )
    
    def __str__(self):
        return self.username

 

5 request.user的由来

1.登录认证(auth认证登录后login后设置了session等信息包含用户的pk)

 

2.用户再次请求登录的时候,通过session中间件,request获取到request.session值

'django.contrib.sessions.middleware.SessionMiddleware',

3.通过AuthenticationMiddlewar取到登录用户信息或匿名用户信息,具体是通过上一步得到的request.session中的user_pk

'django.contrib.auth.middleware.AuthenticationMiddleware',

 

原文地址:https://www.cnblogs.com/xupengjun/p/14240013.html