我正在使用django,我拥有非常复杂的权限矩阵。假设我有10组权限组,如
Permissions = [basic, medium, advanced , very advanced , admin , superadmin , public , etc]
另一个是我有10个模型,所有模型对每个组都有不同的view, edit
权限,所以整个规则变成了10 X 10
及更多的marix。
我现在所有的代码都没有权限。我真的不想在所有地方触摸当前代码以进行权限检查。
我需要在以下地点进行权限检查
permssions将基于登录用户权限组
有没有办法在显示delete,update,insert
的任何视图之前,系统会自动检查权限矩阵而不在视图中编写任何代码。
然后只剩下剩下的东西将出现在可以写入的模板中
答案 0 :(得分: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()
答案 1 :(得分:0)
在视图中,您可以使用permission decorators!
它们看起来像这样:
transform: translate3D(0,0,0.5px)
或者,除了登录以外,还需要其他权限:
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):
....