MST

星途 面试题库

面试题:Python - Django框架中如何实现用户认证与权限管理

在Django项目里,简述实现用户注册、登录功能的一般步骤,以及如何基于用户角色分配不同的权限,比如普通用户只能查看某些页面,管理员用户能进行增删改操作。请说明涉及到的主要模块和方法。
18.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

用户注册步骤

  1. 创建用户模型:在models.py中定义用户模型,继承AbstractUserAbstractBaseUser,添加额外字段,如手机号、邮箱等。例如:
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    email = models.EmailField(unique=True)
  1. 创建注册视图:在views.py中编写注册视图函数,处理用户注册表单的提交。使用UserCreationForm(或自定义表单)验证和保存用户数据。示例:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from.models import CustomUser

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. 创建注册模板:在templates目录下创建register.html模板,包含注册表单。
<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Register</button>
    </form>
</body>
</html>
  1. 配置URL:在urls.py中配置注册URL,将其映射到注册视图。
from django.urls import path
from. import views

urlpatterns = [
    path('register/', views.register, name='register'),
]

用户登录步骤

  1. 创建登录视图:在views.py中编写登录视图函数,处理用户登录表单的提交。使用AuthenticationForm验证用户登录信息,并使用login函数登录用户。示例:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, logout

def user_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')
    else:
        form = AuthenticationForm()
    return render(request, 'login.html', {'form': form})
  1. 创建登录模板:在templates目录下创建login.html模板,包含登录表单。
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Login</button>
    </form>
</body>
</html>
  1. 配置URL:在urls.py中配置登录URL,将其映射到登录视图。
from django.urls import path
from. import views

urlpatterns = [
    path('login/', views.user_login, name='login'),
]

基于用户角色分配权限

  1. 定义用户角色:在用户模型中添加角色字段,如role = models.CharField(max_length=20, choices=[('admin', 'Admin'), ('user', 'User')])
  2. 权限分配
    • 基于视图函数:在视图函数中,根据用户角色判断是否有权限执行操作。例如:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required

@login_required
def restricted_view(request):
    if request.user.role == 'admin':
        # 执行增删改操作
        return render(request,'restricted.html')
    else:
        return redirect('home')
- **基于中间件**:创建自定义中间件,在请求处理前检查用户角色和权限。示例:
class RoleBasedMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated and request.user.role!= 'admin' and request.path.startswith('/admin_only/'):
            return redirect('home')
        response = self.get_response(request)
        return response
在`settings.py`中添加中间件:`MIDDLEWARE = [
  ...
    'your_app.middleware.RoleBasedMiddleware',
  ...
]`

3. 模板中权限控制:在模板中,根据用户角色显示或隐藏特定内容。例如:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    {% if user.role == 'admin' %}
        <a href="{% url 'create' %}">Create</a>
        <a href="{% url 'delete' %}">Delete</a>
    {% endif %}
</body>
</html>

主要模块和方法

  1. django.contrib.auth模块:提供用户认证和权限管理的核心功能。
    • AbstractUserAbstractBaseUser:用于创建自定义用户模型。
    • UserCreationForm:用于用户注册表单。
    • AuthenticationForm:用于用户登录表单。
    • loginlogout:用于用户登录和注销。
  2. django.contrib.auth.decorators模块:提供装饰器,如login_required,用于限制未登录用户访问特定视图。
  3. 自定义中间件:用于在请求处理过程中进行全局的权限检查。
  4. 模板标签:如if标签,在模板中根据用户角色控制内容显示。