Django自带的用户认证

本文详细介绍了Django框架中的auth模块,包括用户认证、登录、注销等功能的实现方式,以及如何扩展默认的用户模型和自定义认证系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

auth模块:

from django.contrib import auth

auth模块中的方法:
authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

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

user = authenticate(username=‘theuser’,password=‘thepassword’)

login(HttpRequest, user)  
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

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

用法:

from django.contrib.auth import authenticate, login

def my_view(request):
username = request.POST[‘username’]
password = request.POST[‘password’]
user_obj = authenticate(username=username, password=password)
if user_obj:
login(request, user_obj)

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

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

from django.contrib.auth import logout

def logout_view(request):
logout(request)

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

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

1
LOGIN_URL = ‘/login/’ # 这里配置成你项目登录页面的路由

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

事例:

修改密码
扩展默认的auth_user表

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
“”"
用户信息表
“”"
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)

def __str__(self):
    return self.username

按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

引用Django自带的User表,继承使用时需要设置

AUTH_USER_MODEL = “app名.UserInfo”

自定义认证系统默认使用的数据表之后,我们就可以像使用默认的auth_user表那样使用我们的UserInfo表了。比如:

创建普通用户:

UserInfo.objects.create_user(username=‘用户名’, password=‘密码’)
创建超级用户:

UserInfo.objects.create_superuser(username=‘用户名’, password=‘密码’)

### 自定义和扩展Django内置的身份验证系统 #### 创建自定义User模型 为了更好地满足特定应用程序的需求,可以创建一个继承`AbstractBaseUser`或`AbstractUser`的自定义用户类。当需要完全控制用户的字段时,推荐使用`AbstractBaseUser`;而如果只是想要添加额外的信息,则可以选择`AbstractUser`[^1]。 对于大多数情况而言,基于`AbstractUser`来构建会更加简便快捷: ```python from django.contrib.auth.models import AbstractUser, BaseUserManager from django.db import models class CustomUser(AbstractUser): # 添加新的字段 birth_date = models.DateField(null=True, blank=True) class Meta: verbose_name_plural = 'Custom Users' ``` #### 使用自定义管理器 每当定义一个新的用户模型时,通常也需要提供相应的管理器以便于处理用户数据的操作。这可以通过继承`BaseUserManager`并重写其方法来完成。例如,在上面的例子中我们可以这样操作: ```python class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('The Email field must be set') email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('Superuser must have is_superuser=True.') return self.create_user(email, password, **extra_fields) class CustomUser(AbstractUser): username = None # 不再使用默认的用户名作为唯一标识符 email = models.EmailField(unique=True) objects = CustomUserManager() USERNAME_FIELD = 'email' # 设置电子邮件地址为登录凭证 REQUIRED_FIELDS = [] # 注册新账户所需的其他必填项,默认为空列表 ``` #### 更新设置文件 为了让整个项目知道要使用的是哪一个用户模型而不是默认的那个(`auth.User`),还需要修改项目的settings.py文件中的AUTH_USER_MODEL配置项指向刚刚创建的新模型路径。注意这项更改应该尽可能早地做出,因为一旦数据库中有任何依赖关系存在之后就很难改变它了。 ```python # settings.py INSTALLED_APPS = [ ... ] AUTH_USER_MODEL = 'myapp.CustomUser' # 替换成实际的应用名称以及自定义用户类名 ``` 以上就是关于如何在Django框架下对内建的身份验证机制进行定制化调整的方法介绍。通过这种方式不仅可以根据业务逻辑的要求灵活设计用户表结构,同时也能够方便地集成第三方服务或者实现更复杂的安全策略[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值