django从入门到精通(六)——auth认证及自定义用户
Django 提供了一个强大的用户认证系统,允许开发者轻松管理用户的注册、登录、权限和组等功能。以下是对 Django 用户认证系统的详细介绍,包括默认的用户认证、自定义用户认证和权限设置。
1. 默认用户认证
1.1 用户模型
Django 默认提供了一个用户模型 User
,位于 django.contrib.auth.models
模块中。该模型包含以下字段:
username
: 用户名,唯一。password
: 密码,经过哈希处理。email
: 电子邮件地址。first_name
: 名字。last_name
: 姓氏。is_active
: 布尔值,指示用户是否活跃。is_staff
: 布尔值,指示用户是否可以登录到管理后台。is_superuser
: 布尔值,指示用户是否为超级用户。last_login
: 用户最后登录时间。date_joined
: 用户注册时间。
1.2 用户注册
您可以使用 Django 表单来处理用户注册。以下是一个简单的用户注册视图示例:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save() # 保存用户
return redirect('login') # 注册后重定向到登录页面
else:
form = UserCreationForm()
return render(request, 'register.html', {'form': form})
1.3 用户登录
Django 提供了内置的登录视图,您可以使用 LoginView
来处理用户登录。
示例:
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
template_name = 'login.html' # 自定义登录模板
在 urls.py
中配置 URL:
from django.urls import path
from .views import CustomLoginView
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
]
1.4 用户登出
Django 也提供了内置的登出视图,您可以使用 LogoutView
来处理用户登出。
示例:
from django.contrib.auth.views import LogoutView
urlpatterns = [
path('logout/', LogoutView.as_view(), name='logout'),
]
1.5 用户认证
您可以使用 authenticate()
和 login()
函数来手动处理用户认证。
from django.contrib.auth import authenticate, login
def user_login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user) # 登录用户
return redirect('home')
else:
# 返回错误信息
...
2. 自定义用户认证
如果您需要更复杂的用户模型,可以通过扩展 AbstractUser
或 AbstractBaseUser
来创建自定义用户模型。
2.1 使用 AbstractUser
通过继承 AbstractUser
,您可以添加额外的字段。
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True, null=True)
在 settings.py
中指定自定义用户模型:
AUTH_USER_MODEL = 'yourapp.CustomUser'
2.2 使用 AbstractBaseUser
如果您需要完全控制用户模型,可以继承 AbstractBaseUser
。
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
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)
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
2.3 创建和迁移自定义用户模型
在定义自定义用户模型后,您需要创建和应用迁移:
python manage.py makemigrations
python manage.py migrate
3. 权限设置
Django 的用户认证系统还提供了权限管理功能。每个用户可以被分配不同的权限。
3.1 权限模型
Django 默认提供了三种权限:
add
: 添加对象的权限。change
: 修改对象的权限。delete
: 删除对象的权限。
您可以在模型中自定义权限:
class Blog(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
class Meta:
permissions = [
('can_publish', 'Can Publish Blog'),
]
3.2 检查权限
您可以使用 user.has_perm()
方法检查用户是否具有特定权限。
if request.user.has_perm('yourapp.can_publish'):
# 用户有发布权限
...
3.3 组管理
Django 允许将用户分组,以便于管理权限。您可以创建组并为组分配权限。
from django.contrib.auth.models import Group
# 创建组
group, created = Group.objects.get_or_create(name='Editors')
# 添加权限
group.permissions.add(permission)
# 将用户添加到组
user.groups.add(group)
4. 总结
- 默认用户认证:Django 提供了内置的用户模型和认证视图,支持用户注册、登录和登出。
- 自定义用户认证:可以通过继承
AbstractUser
或AbstractBaseUser
创建自定义用户模型。 - 权限设置:Django 提供了权限管理功能,允许为用户和组分配权限。