是否有可能在用户编辑页面中更改权限列表?我不想显示所有权限,例如管理员日志条目或身份验证组等.如何修改主查询集以排除其中的一些权限?
我希望在我的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中,为具有"admin"权限的用户实现具有额外功能的模板的最佳方式是什么.
我不确定是否应该为管理员创建一组完全不同的视图,或者将其集成到我现有的视图和模板中,例如"if user is a admin".
在Django中有标准的方法吗?
有
from guardian.shortcuts import get_objects_for_user
Run Code Online (Sandbox Code Playgroud)
但是关于
from guardian.shortcuts import get_users_for_object
Run Code Online (Sandbox Code Playgroud)
谢谢。
我正在使用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
我目前正在开发一个管理仪表板,其中仅包含标记为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
我正在开发一种产品,允许不同的学校在线管理他们的内容.
其中一部分涉及建立一个我自己编写的基于角色的访问控制逻辑.从本质上讲,每所学校都有自己的一组角色,这些角色拥有自己的一组权限.该软件的用户可以属于在任何给定时间具有不同角色的多个学校.
出于各种原因,我想放弃这个,而是使用Django的组和权限以及像django-guardian这样的库.我面临的问题是我应该如何扩展Groups模型,以便我可以在每个新学校中包含一个外键,并且仍然能够使用Django中的辅助方法以及像django-guardian这样的库.
我想出的一种可能的方法是简单地根据事件名称创建组,例如"学校1 - 管理员","学校1 - 教师","学校2 - 管理员","学校2 - 教师"和基于的查询权限相反.有这么好的理由我不应该这样做吗?
我想执行以下迁移:
# -*- 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仍然没有另一个模块的模型的权限,尽管这个其他模块被注册为此迁移的依赖性.
我可以确认只有在执行所有迁移后才会添加丢失的权限.
根据文档,可以创建和使用自定义权限,如下所示:
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'),那么这个错字就不会被注意到了.
如果不使用现有权限,我想获得异常或警告.
为了首先避免打字错误,我想有常量:user.PERM_APP_VIEW_TASKS或类似的东西.
我查看了关于同一主题的类似问题,我认为我遵循了为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)