我是相当新的django休息框架,我在权限方面有一些问题.
所以我有一个用户是组织的成员和某个组的成员.让我们说我们有一个模型:
class SomeModel:
organization = models.ForeignKey(Organization)
name = models.CharField()
Run Code Online (Sandbox Code Playgroud)
用户只能create/ update SomeModel为自己的组织,如果他是一组"协调员",他也可以create/ update为任何组织.
目前我的方法是在序列化器,in .create()和.update()方法中检查这些条件,因为数据已经过验证,我在PermissionDenied那里引发了错误.但感觉这不是"正确的方式".我尝试制作自定义权限类,但之后数据未经过验证,因为在序列化程序之前会检查权限类.你有什么建议我应该怎么做?
抱歉英语不好,这不是我的母语.谢谢!
编辑: 示例:请求数据类似于:
payload = {'organization': 1, 'name': 'Name'}
Run Code Online (Sandbox Code Playgroud)
因此,如果用户来自组织1,或者他是协调员,则应授予访问权限并SomeModel应创建访问权限
python django django-permissions django-serializer django-rest-framework
我正在尝试使用 Django rest 框架在我的 Django 应用程序中添加自定义权限。我创建了一个 API n 在邮递员中对其进行了测试,它对于经过身份验证的用户来说工作正常。但是当我访问详细信息视图时它不显示详细信息。例如,当我访问http://localhost:8000/placeslist/ 时,它会显示所有地方,但是当我尝试http://localhost:8000/placeslist/1/ 时,它说您没有权限。我不知道我哪里出错了
模型.py
class Places(BaseModel):
name = models.CharField(max_length=255,null=True,default='')
owner=models.ForeignKey('auth.User',related_name='place_list',on_delete=models.CASCADE,null=True)
Run Code Online (Sandbox Code Playgroud)
视图.py
class PlacesView(generics.ListCreateAPIView):
queryset = Places.objects.all()
serializer_class = PlacesSerializer
permission_classes = (permissions.IsAuthenticated, IsOwner)
def perform_create(self,serializer):
serializer.save(owner=self.request.user)
class PlacesDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Places.objects.all()
serializer_class = PlacesSerializer
permission_classes = (permissions.IsAuthenticated, IsOwner)
Run Code Online (Sandbox Code Playgroud)
权限.py
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
if isinstance(obj, Places):
return obj.owner == request.user
return obj.owner == request.user
Run Code Online (Sandbox Code Playgroud)
序列化器.py
class PlacesSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Places …Run Code Online (Sandbox Code Playgroud) 我正在试图弄清楚Django Groups,并且该网站上的文档非常简单.
例如,您可以使用装饰器permission_required()来检查权限,但是,这仅检查您是否直接分配了权限.我已将用户分配给具有权限设置的组.使用Django的权限系统时,它会忽略用户所属的组.
有没有办法让Django继承用户组的权限?
对于我的“教程应用程序”,我在创建对象后创建了一些特定权限。只有对象的作者才能更新或删除它。
\n\n我是初学者,我是来学习的,如果我的方法丑陋请宽容。
\n\n这是我的观点.py
\n\nclass CreateArticle(LoginRequiredMixin, generic.CreateView):\n\nmodel = Article\ncontext_object_name = \'article\'\ntemplate_name = "blog/edit_article.html"\nform_class = ArticleForm\n\ndef form_valid(self, form):\n self.object = form.save(commit=False)\n self.object.slug = auto_slug(self.object.titre)\n user = User.objects.get(id=self.request.user.id)\n self.object.auteur = user\n\n self.object.save()\n\n """On g\xc3\xa9n\xc3\xa8re les 2 permissions suivantes :\n Modifier l\'article dont on est l\'auteur\n Supprimer l\'article dont on est l\'auteur"""\n\n content_type = ContentType.objects.get(app_label=\'blog\', model=\'article\')\n permission = Permission.objects.create(\n codename=\'edit_article_{0}\'.format(self.object.id),\n name=\'Modifier l\\\'article {0}\'.format(self.object.titre),\n content_type=content_type\n )\n user.user_permissions.add(permission)\n permission = Permission.objects.create(\n codename=\'delete_article_{0}\'.format(self.object.id),\n name=\'Supprimer l\\\'article {0}\'.format(self.object.titre),\n content_type=content_type\n )\n user.user_permissions.add(permission)\n\n messages.success(self.request, "L\'article a \xc3\xa9t\xc3\xa9 cr\xc3\xa9e")\n …Run Code Online (Sandbox Code Playgroud) 我得到了这个视图,并且正在使用PermissionRequiredMixin它......它工作正常,但是当我重定向到登录模板(在设置中设置LOGIN_URL)时,我需要它显示一条消息,例如“您无权执行此操作”。知道如何在不创建自定义装饰器而仅使用PermissionRequiredMixin其自身的情况下做到这一点吗?
from django.contrib.auth.mixins import PermissionRequiredMixin
class MyView(PermissionRequiredMixin,View):
template = 'myapp/item_detail.html'
permission_required = 'myapp.change_item'
def get(self, request, *args, **kwargs):
#Query here
return render(request, self.template)
Run Code Online (Sandbox Code Playgroud)
为了实现这一目标,我需要添加什么?
我试图按照此添加新的迁移教程
我增加了新的权限内Meta到permissions现场。然后,我创建了迁移,并尝试修改此迁移以适当地更新组权限。但得到DoesNotExist的RunPython操作。
from django.db import migrations
def assign_new_permission(apps, *args):
Permission = apps.get_model('auth.Permission')
Group = apps.get_model('auth.Group')
# __fake__.DoesNotExist: Permission matching query does not exist.
new_permission = Permission.objects.get(
codename='my_new_permissoin_code')
admins = Group.objects.get(name='Group name')
admins.permissions.add(new_permission)
class Migration(migrations.Migration):
dependencies = [
('my_app', '0066_some_migratoin'),
]
operations = [
migrations.AlterModelOptions(
name='my_model',
options={'permissions': (('my_new_permissoin_code',
'Permission name'),)},
),
migrations.RunPython(assign_new_permission)
]
Run Code Online (Sandbox Code Playgroud) 在我用 Django 开发的网站上,我想限制对视图的访问,以便只有超级用户才能访问它们。我可以使用@login_required或LoginRequiredMixin,但是我已经有一个普通人的登录系统,这样任何登录用户都可以访问该视图。
我尝试了一些我认为可以SuperUserRequired作为 mixin工作的东西,但这显然不起作用。
这必须能够在 CBV 中工作,因为这就是我用于此视图的内容。这是我想应用此限制的相关视图。
class CreatePostView(LoginRequiredMixin,CreateView):
redirect_field_name = 'posts/post_detail.html'
form_class = PostForm
model = Post
def form_valid(self,form):
form.instance.author = self.request.user
return super().form_valid(form)
Run Code Online (Sandbox Code Playgroud)
谢谢你提供的所有帮助 :)
所以我有一个系统,用户可以通过模型成员成为称为框的模型的一部分。
成员模型有自己的一组角色,而这些角色又拥有自己的权限。
我有特定的方法来确定成员在框中拥有哪一组权限。
现在我有一个名为“box_{box_id}”的 websocket 组,成员可以连接到该组。出站事件(例如与框相关的模型创建)将发送到该组。
但是,某些成员不应侦听基于其拥有的权限发送的某些事件。
这是将发送到表示事件的组的示例消息 {'event': EVENT TYPE, 'data': EVENT DATA}
因此,例如,现在,如果用户在框中没有 READ_UPLOADS 权限,则无法侦听类型为 UPLOAD_CREATE 的事件
如何使用 django 通道实施此类检查?
编辑
class LocalEventsConsumer(AsyncWebsocketConsumer):
"""
An ASGI consumer for box-specific (local) event sending.
Any valid member for the given box can connect to this consumer.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.box_id = self.scope['url_route']['kwargs']['box_id']
self.events_group_name = 'box_%s_events' % self.box_id
self.overwrites_cache = {}
self.permissions_cache = set()
# need to update cache on role and overwrite updates
async def connect(self): …Run Code Online (Sandbox Code Playgroud) resources/<int:pk>我在 Django Rest 框架权限中获取 url 中的 params pk 时遇到问题。
def has_permission(self, request, view):
#extract params pk here
pass
Run Code Online (Sandbox Code Playgroud)
我尝试过request.POST.get('pk')但它什么也没返回。
您好,有什么方法可以检查模板中自定义用户 nit 请求用户的权限。代码示例:
{% for agency_user in users %}
<tr>
<td>{{ agency_user.username }}</td>
<td>{{ agency_user.get_full_name }}</td>
<td>{{ agency_user.groups.all.first.name }}</td>
<td>{{ agency_user.min_price }}</td>
<td>{{ agency_user.max_price }}</td>
{% if agency_user|has_perm:'may_see_commerce_sell' %} #not working
<td>some action</td>
{% else %}
<td>some action</td>
{% endif %}
<td>
<a href="{% url 'user_edit' agency_user.id %}" class="edit icon"></a>
<a user-id="{{ agency_user.id }}" class="trash icon" title="some action"></a>
</td>
</tr>
{% empty %}
<td style="text-align: center" colspan="11">some action</td>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
或者我必须为每个用户权限编写自定义模型方法?
类似于在 Profile 模型中思考:
def sell_commerce(self):
if self.has_perm('may_see_commerce_sell'):
return …Run Code Online (Sandbox Code Playgroud)