本文介绍: Django还提供了权限控制中间件,让用户可以视图处理请求之前进行权限校验,进一步加强了权限管理的灵活性和安全性。这也都正是我们选择和喜爱Django原因之一。

Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来我们就来探究一下Django如何处理用户验证和权限管理的。

用户验证

Django自带的User模型及伴随的Django框架对于只需要基本访问授权用户验证需求的应用来说已经足够了。下面,就让我们实现一个用户登录功能

创建视图

视图中,我们主要使用Django提供的authenticate()login()函数

from django.contrib.auth import authenticate, login

def login_view(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:
            return render(request, 'login.html', {'error': '用户名密码错误'})
    else:
        return render(request, 'login.html')

此处,authenticate()函数会在给定用户名密码有效时返回一个User对象。如果用户名密码无效,则authenticate()返回None。

权限管理

在进行权限管理时,Django提供了三种级别的权限控制模型级别对象级别视图级别。

模型级别

模型级别的权限主要是针对整个模型的增、删、查、改进行设置

class Meta:
    permissions = [
        ("view_project", "Can see available project"),
        ("add_project", "Can add project"),
        ("change_project", "Can edit project"),
        ("delete_project", "Can delete project"),
    ]

可以项目的模型中如上所示定义权限。

对象级别

对象级别的权限管理允许你在单个对象(例如数据库中的一条记录)上设置权限,这对于实现更细粒度的权限控制非常有用。Django本身不直接支持对象级别权限,但可以通过第三方库如django-guardian实现

例如,使用 django-guardian,你可以为单个用户或用户组指定特定对象的权限:

from guardian.shortcuts import assign_perm

# 给用户分配某个特定项目查看权限
assign_perm('view_project', user, project_instance)

视图中,你可以检查用户是否拥有特定对象的权限:

from guardian.shortcuts import get_objects_for_user

def my_view(request):
    # 获取用户可以查看的所有项目
    projects = get_objects_for_user(request.user, 'app.view_project')
    ...

视图级别

视图级别的权限管理是通过限制对特定视图的访问实现的。Django提供了多种方式控制对视图的访问,包括使用装饰器、混入类和中间件

使用装饰

@login_required@permission_required两个常用的视图级权限管理装饰器。例如:

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('app.view_project', raise_exception=True)
def project_detail(request, project_id):
    ...

这里login_required 确保用户必须登录,而 permission_required 确保用户具有特定权限。

使用混入类

基于类的视图(CBV)中,你可以使用混入类来控制权限。例如,使用 LoginRequiredMixinPermissionRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import DetailView

class ProjectDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
    ...
    permission_required = 'app.view_project'

总结

以上就是Django在用户验证和权限管理上的一些基本实践。实际上,Django还提供了更为强大和灵活的功能,例如Django自带的User模型可以根据需求进行扩展,例如添加新的字段;还可以自定义用户模型,完全替代Django的User模型,以便更好地满足复杂的业务需求。另外,Django还提供了权限控制的中间件,让用户可以在视图处理请求之前进行权限的校验,进一步加强了权限管理的灵活性和安全性。这也都正是我们选择和喜爱Django的原因之一。

原文地址:https://blog.csdn.net/ken1583096683/article/details/134726456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23452.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注