Django多组权限 [英] Django multiple group permission

查看:45
本文介绍了Django多组权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对组权限也有类似的问题,但就我而言,我具有多个组权限

在我的 decorator.py 中我应该怎么做,如果用户拥有注册服务商的权限,它将转到注册服务商"页面;如果用户拥有注册人的权限,则将其转到错误页面,同样会计

解决方案

据我所知,您已经尝试创建自己的装饰器.但是逻辑上存在一些问题;

来自functools导入包装的

 def groups_only(* groups):def内部(view_func):@wraps(view_func)def wrapper_func(request,* args,** kwargs):如果request.user.groups.filter(name__in = groups).exists():返回view_func(request,* args,** kwargs)别的:return HttpResponse('您无权查看此页面')返回wrapper_func返回内部 

您可以按如下方式使用新的装饰器:

  @groups_only('Admin','Registrar')def registrar_adminpage(请求):#这是针对组权限注册商"的返回render(request,'Homepage/Registrar_adminsite.html'}) 

另一种解决方案是使用注释中提到的 user_pass_test 装饰器.但是,在这种情况下很难动态传递用户组.您将为每种情况编写一个新的测试功能.

为了调试权限名称上的问题,您可以按以下方式更改装饰器:

来自functools导入包装的

 def groups_only(* groups):def内部(view_func):@wraps(view_func)def wrapper_func(request,* args,** kwargs):print('Allowed User Groups:',','.join(groups))print('Users Current Groups:',','.join(list(request.user.groups.all().values_list('name',flat = True)))))如果request.user.groups.filter(name__in = groups).exists():返回view_func(request,* args,** kwargs)别的:return HttpResponse('您无权查看此页面')返回wrapper_func返回内部 

在运行此代码时,您将看到在runserver stdout上打印的允许的组和用户组.您可以检查是否有问题.

I have similar question about group permission but in my case i have multiple group permission

what should i do in my decorator.py that if the user have permission for registrar it will go to registrar page and if the user have a permission for mis it go to mis page, same goes for the accounting

Django Group permission how to print it in template

This is my views.py

@staff_only
@login_required(login_url='loginpage')
def registrar_adminpage(request):
     #this is for group permission 'Registrar'
    return render(request, 'Homepage/Registrar_adminsite.html'})

@staff_only
@login_required(login_url='loginpage')
def mis_adminpage(request):
     #this is for group permission 'MIS'
    return render(request, 'Homepage/mis_adminsite.html'})

@staff_only
@login_required(login_url='loginpage')
def accounting_adminpage(request):
     #this is for group permission 'Accounting'
    return render(request, 'Homepage/accounting_adminsite.html'})

my decorators.py

def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_staff:

            return redirect('registrar_adminpage')
        else:
            return view_func(request, *args, **kwargs)
    return wrapper_func

def allowed_users(allowed_roles=None):
    if allowed_roles is None:
        allowed_roles = []
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):
            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name
            if group in allowed_roles:
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('You are not authorized to view this page')
        return wrapper_func
    return decorator


def staff_only(view_func):
    def wrapper_function(request, *args, **kwargs):
        groups = None
        if request.user.groups.exists():
            groups = list(request.user.groups.all().values_list('name', flat=True))
        if 'registrar' in groups:
            return view_func(request, *args, **kwargs)
        if 'mis' in groups:
            return view_func(request, *args, **kwargs)
        if 'accounting' in groups:
            return view_func(request, *args, **kwargs)
        return redirect("registrar_adminpage")

    return wrapper_function

update this is the name of my group permission and specific user (staff)

解决方案

As far as i can see you have tried to create a decorator of yours. However there are some problems in the logic;

from functools import wraps

def groups_only(*groups):
    def inner(view_func):
        @wraps(view_func)
        def wrapper_func(request, *args, **kwargs):
            if request.user.groups.filter(name__in=groups).exists():
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('You are not authorized to view this page')
        return wrapper_func
    return inner

You may use your new decorator as follows:

@groups_only('Admin', 'Registrar')
def registrar_adminpage(request):
     #this is for group permission 'Registrar'
    return render(request, 'Homepage/Registrar_adminsite.html'})

The other solution is using user_pass_test decorator as it is mentioned in the comments. However it would be hard to pass user groups dynamically for that scenario. You will be coding a new test function for each cases.

In order to debug the problems on permission names you can change the decorator as following:

from functools import wraps

def groups_only(*groups):
    def inner(view_func):
        @wraps(view_func)
        def wrapper_func(request, *args, **kwargs):
            print('Allowed User Groups:', ','.join(groups))
            print('Users Current Groups:', ','.join(list(request.user.groups.all().values_list('name', flat=True))))
            if request.user.groups.filter(name__in=groups).exists():
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('You are not authorized to view this page')
        return wrapper_func
    return inner

While running this code you will be seeing the allowed groups and users groups printed on the runserver stdout. You may check if there is something wrong.

这篇关于Django多组权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆