如何在django中创建中间件来检查用户的权限?

问题描述 投票:0回答:1

我正在尝试在 django 中创建自定义管理面板。我可以在那里创建用户,并且可以检查用户是否

is_admin
。如果用户不是管理员,他不应该能够访问管理面板页面,也不应该能够修改任何内容。

我需要创建中间件来检查用户是否是管理员,如果不是,则将其重定向到主页。我认为我应该使用

@permission_required
,但我不确定如何在中间件中使用它。

这是创建新用户的功能:

# views.py
def createNewUser(request):
    if request.method == 'POST':
        user = User.objects.create(username=request.POST.get('username'),
                                   email=request.POST.get('email'),
                                   password=request.POST.get('password'))
        if request.POST.get('is_admin') == 'True':
            is_admin = 'True'
        else:
            is_admin = 'False'
            user.user_permissions.clear()
        user.save()
        useraccount = UserAccount.objects.create(user=user, is_admin=is_admin)
        useraccount.save()
        return redirect('users')
    return render(request, 'adminpanel/create_user.html', {})

该用户可以是管理员。如果我不选中复选框,则他不是管理员,并且不允许他在此页面上执行任何操作。我只是清除所有权限。(我知道删除特定权限可能比删除全部权限更好,但这只是一个示例) 现在我必须在每个函数之前检查他的权限:

@permission_required('poll.view_category', login_url='home')
def home(request):
    return render(request, 'adminpanel/main.html', {})

那么,如何在中间件中使用这个装饰器呢? (它只能在管理面板请求中调用) 使用函数中间件和基于类的中间件哪个更好?有什么区别?

python django
1个回答
1
投票

中间件检查每个请求,因此可能不是限制对单个视图甚至几个视图的访问的最有效方法。使用装饰器可能是更好的选择。

最简单的方法就是检查视图顶部

def home(request):
    if not request.user.useraccount.is_admin
        return render(request, 'login.html', {})

如果您想在多个视图中重复使用此逻辑,您可以使用 user_passes_test 装饰器

from django.contrib.auth.decorators import user_passes_test


def admin_check(user):
    return user.useraccount.is_admin


@user_passes_test(admin_check)
def my_view(request):

如果您想在多个应用程序中使用它而不重新创建测试,您可以使用 lambda 函数

@user_passes_test(lambda u: u.useraccount.is_admin)

我个人的偏好是先了解基于函数的视图,然后再了解基于类的视图,这样您就知道基于类的视图在幕后为您做什么。当您使用基于上面的函数时,我暂时会坚持使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.