0

我正在使用 django 并且我有非常复杂的权限矩阵。假设我有 10 组权限组,例如

Permissions = [basic, medium, advanced , very advanced , admin , superadmin , public , etc]

另一件事是我有 10 个模型,并且所有模型view, edit对每个组都有不同的权限,所以总的来说,规则变成了一种10 X 10等等。

我现在没有权限就拥有所有代码。我真的不想在所有地方触摸当前代码进行权限检查。

我需要在以下地方进行权限检查

权限将基于登录的用户权限组

  1. 在模板中,我们将根据权限显示编辑、插入、删除按钮
  2. 在显示之前的视图中,检查用户是否可以查看/更新/删除它

有没有办法在显示delete,update,insert系统的任何视图之前自动从权限矩阵中检查,而无需在视图中编写任何代码。

然后只剩下可以在需要时编写的模板

4

2 回答 2

1

我相信您只是在寻找 Django 在模板中提供的权限变量

https://docs.djangoproject.com/en/1.5/topics/auth/default/#permissions

{% if perms.foo %}
    <p>You have permission to do something in the foo app.</p>
    {% if perms.foo.can_vote %}
        <p>You can vote!</p>
    {% endif %}
    {% if perms.foo.can_drive %}
        <p>You can drive!</p>
    {% endif %}
{% else %}
    <p>You don't have permission to do anything in the foo app.</p>
{% endif %}

示例中间件:

from django import http

class PermissionMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        # you should somehow derive this from the view function and/or view args/kwargs
        your_object = SomeThing.objects.get(...)

        if not request.user.has_perm('name_of_your_object.permission'):
            return http.HttpResponseForbidden()
于 2013-04-14T00:34:11.400 回答
0

在视图中,您可以使用权限装饰器

它们看起来像这样:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

或者这个,不仅仅是登录,即权限:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
    ...

如果您需要更复杂的场景(这些是我为自己制作的),您还可以定义自己的装饰器:

from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import PermissionDenied


def group_required(*group_names):
    """Requires user membership in at least one of the groups passed in."""

    def in_groups(u):
        if u.is_authenticated:
            if u.groups.filter(name__in=group_names).exists() | u.is_superuser:
                return True
        return False
    return user_passes_test(in_groups)


def superuser_only(function):
    """Limit view to superusers only."""

    def _inner(request, *args, **kwargs):
        if not request.user.is_superuser:
            raise PermissionDenied
        return function(request, *args, **kwargs)
    return _inner


def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists()

...并像这样使用它们:

@login_required
@group_required('A', 'B')
def my_view(request):
    ....

为了在模板中使用,您可以定义自己的模板标签:

from django import template

register = template.Library()


@register.filter
def multiply(value, arg):
    return (value * arg)
于 2019-05-16T10:37:50.027 回答