标签: django-permissions

Django admin - 更改权限列表

是否有可能在用户编辑页面中更改权限列表?我不想显示所有权限,例如管理员日志条目或身份验证组等.如何修改主查询集以排除其中的一些权限?

django django-admin django-permissions

7
推荐指数
1
解决办法
4370
查看次数

Django权限

我希望在我的Django项目中获得更多细化权限,但无法确定要使用的应用程序.我所拥有的是:

class Item(models.Model):
    name = models.CharField(max_length=64, unique=True)
    description = models.CharField(max_length=128, default='')
    logo = ImageField(upload_to=/tmp, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

现在有了Django标准权限,我有可能在添加,更改和删除之间做出选择,我想要的是扩展更改权限,例如,只提供组权限以更改徽标,但禁止同一组修改项目描述.我不想或不需要用户输入关系,而只是让不同的组可以使用标准管理界面编辑模型的单个字段.我甚至不确定我是否在谈论每个对象的许可?

有谁知道最好用什么或我自己如何实现它?我还可以设想让只读用户能够访问/读取所有内容但无法修改,这两者都不可能.

谢谢你的帮助.

django django-models django-admin django-permissions

7
推荐指数
1
解决办法
4525
查看次数

Django - 向管理员显示不同的模板

在Django中,为具有"admin"权限的用户实现具有额外功能的模板的最佳方式是什么.

我不确定是否应该为管理员创建一组完全不同的视图,或者将其集成到我现有的视图和模板中,例如"if user is a admin".

在Django中有标准的方法吗?

django django-permissions

7
推荐指数
2
解决办法
5470
查看次数

7
推荐指数
2
解决办法
1906
查看次数

Django基于框架组的各个视图的权限

我正在使用DRF编写API.我想为我的Modelviewsets中的每个视图赋予不同的权限.我有两个小组(客户和员工).我在permissions.py中将它们过滤为Isstaff和Iscustomer .

class Iscustomer(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='customers'):
            return True
        return False


class Isstaff(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='staff'):
            return True
        return False
Run Code Online (Sandbox Code Playgroud)

我试图覆盖使用get_permissions方法.当我放入一个组时self.permission_classes,它工作正常.

class cityviewset(viewsets.ModelViewSet):
    queryset = city.objects.all()
    serializer_class = citySerializer

    def get_permissions(self):    
        if self.request.method == 'POST' or self.request.method == 'DELETE':
            self.permission_classes = [Isstaff]
        return super(cityviewset, self).get_permissions()
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将多个组放入时self.permission_classes,它会失败.

def get_permissions(self):
    if self.request.method == 'POST' or self.request.method == 'DELETE':
        self.permission_classes = [Isstaff,Iscustomer,]
    return super(cityviewset, self).get_permissions()
Run Code Online (Sandbox Code Playgroud)

django permissions django-permissions django-rest-framework role-based-access-control

7
推荐指数
1
解决办法
3946
查看次数

Django UserPassesTestMixin 困惑/问题?

我目前正在开发一个管理仪表板,其中仅包含标记为Business用户的公司管理员的特定视图。

该应用程序将有大约 10 次浏览,我有一些关于UserPassesTestMixin

基本上我所有的观点都会包括这一点,

def test_func(self):
    return self.request.user.user_type == 'Business'
Run Code Online (Sandbox Code Playgroud)

为了确保用户是Business用户,我以这种方式保护视图。

我自己无法解决的几个问题是:

现在,如果重复 10 次,是否有一种更干净的方法来做到这一点,而不是 def test_func在每个 CBV 中都采用这种方法?

出现的另一个问题是,如果用户没有通过测试,它会重定向到登录页面,我也不喜欢这个页面。这些视图都返回 json。如果用户没有通过测试,我想将他们发送到类似的地方,

JsonResponse({'message': 'Only company administrators have access to this view'})
Run Code Online (Sandbox Code Playgroud)

仅当用户未通过测试时,我如何才能更改该重定向?请记住,这些视图也继承自LoginRequiredMixin其中,如果用户未登录,我想保持登录页面的原始重定向不变。

非常感谢对此的任何帮助。Django 的这一面对我来说相当新鲜!

django django-views django-permissions django-class-based-views

7
推荐指数
1
解决办法
4647
查看次数

Django组和权限.扩展组以获得FK?

我正在开发一种产品,允许不同的学校在线管理他们的内容.

其中一部分涉及建立一个我自己编写的基于角色的访问控制逻辑.从本质上讲,每所学校都有自己的一组角色,这些角色拥有自己的一组权限.该软件的用户可以属于在任何给定时间具有不同角色的多个学校.

出于各种原因,我想放弃这个,而是使用Django的组和权限以及像django-guardian这样的库.我面临的问题是我应该如何扩展Groups模型,以便我可以在每个新学校中包含一个外键,并且仍然能够使用Django中的辅助方法以及像django-guardian这样的库.

我想出的一种可能的方法是简单地根据事件名称创建组,例如"学校1 - 管理员","学校1 - 教师","学校2 - 管理员","学校2 - 教师"和基于的查询权限相反.有这么好的理由我不应该这样做吗?

django rbac django-permissions

6
推荐指数
1
解决办法
2731
查看次数

如何在django迁移期间向用户/组添加权限?

我想执行以下迁移:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.auth.models import Permission
from django.db import migrations
from django.conf import settings
from django.contrib.auth.models import Group, User


def add_api_group(apps, schema_editor):

    Group.objects.create(name=settings.API_USER_GROUP)
    # get_or_create returns a tuple, not a Group
    group = Group.objects.get(name=settings.API_USER_GROUP)
    permissions = Permission.objects.filter(codename__in = [
        'add_topic',
    ])
    group.permissions.add(*permissions)


def add_api_user(apps, schema_editor):

    user = User.objects.create_user(username=settings.API_USER, password=settings.API_USER_PASSWORD)
    group = Group.objects.get(name=settings.API_USER_GROUP)
    user.groups.add(group)

class Migration(migrations.Migration):

    dependencies = [
        ('nd_content', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_api_group),
        migrations.RunPython(add_api_user)
    ]
Run Code Online (Sandbox Code Playgroud)

在迁移的最后一行,我发出了一个错误来停止执行并查看数据库状态.问题是表auth_permission仍然没有另一个模块的模型的权限,尽管这个其他模块被注册为此迁移的依赖性.

我可以确认只有在执行所有迁移后才会添加丢失的权限.

django django-models django-permissions django-migrations

6
推荐指数
1
解决办法
2763
查看次数

如何避免django的权限字符串中的拼写错误

根据文档,可以创建和使用自定义权限,如下所示:

class Task(models.Model):
    ...
    class Meta:
        permissions = (
            ("view_task", "Can see available tasks"),
        )
Run Code Online (Sandbox Code Playgroud)

使用权限:

user.has_perm('app.view_task')
Run Code Online (Sandbox Code Playgroud)

来源:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions

如果权限字符串中存在拼写错误.例如:我使用user.has_perm('app.view_tasks'),那么这个错字就不会被注意到了.

目标1

如果不使用现有权限,我想获得异常或警告.

目标2

为了首先避免打字错误,我想有常量:user.PERM_APP_VIEW_TASKS或类似的东西.

django django-permissions

6
推荐指数
1
解决办法
334
查看次数

has_object_permission 未调用

我查看了关于同一主题的类似问题,我认为我遵循了为has_object_permission.

这就是我在我的设置中所拥有的。

REST_FRAMEWORK = {
    
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'users.permissions.CanAccessData', # this is my custom class
    ],    
    ... 
}
Run Code Online (Sandbox Code Playgroud)

这是我的权限类

class CanAccessData(permissions.BasePermission):
    message = 'You do not have permission to perform this action.'

    def has_permission(self, request, view):
        print "has_permission`"
        return True

    def has_object_permission(self, request, view, obj):
        print "has_object_permission"
        return False
Run Code Online (Sandbox Code Playgroud)

这是我的视图结构:

class CompleteList(generics.ListCreateAPIView):
    permission_classes = (CanAccessData,)
    serializer_class = SomeSerializer
    model = Some
    filter_backends = (filters.OrderingFilter, filters.SearchFilter)
    ordering_fields = (tuple of Some fields)
    search_fields = ordering_fields
    ordering = …
Run Code Online (Sandbox Code Playgroud)

django django-permissions django-rest-framework

6
推荐指数
1
解决办法
2707
查看次数