标签: django-permissions

权限检查序列化器,Django休息框架,

我是相当新的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

2
推荐指数
1
解决办法
1238
查看次数

在django中访问api时您无权执行此操作

我正在尝试使用 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 django-permissions django-rest-framework

2
推荐指数
1
解决办法
1万
查看次数

如何获取从用户组继承的权限?

我正在试图弄清楚Django Groups,并且该网站上的文档非常简单.

例如,您可以使用装饰器permission_required()来检查权限,但是,这仅检查您是否直接分配了权限.我已将用户分配给具有权限设置的组.使用Django的权限系统时,它会忽略用户所属的组.

有没有办法让Django继承用户组的权限?

python django django-authentication django-permissions

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

Django - 如何在视图和模板中使用特定的自定义权限?

对于我的“教程应用程序”,我在创建对象后创建了一些特定权限。只有对象的作者才能更新或删除它。

\n\n

我是初学者,我是来学习的,如果我的方法丑陋请宽容。

\n\n

这是我的观点.py

\n\n
class 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)

django django-views django-permissions

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

Django PermissionRequiredMixin 重定向到带有消息的登录模板

我得到了这个视图,并且正在使用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)

为了实现这一目标,我需要添加什么?

django django-templates django-permissions

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

为什么我无法在Django中的同一迁移中为组分配新权限

我试图按照此添加新的迁移教程 我增加了新的权限内Metapermissions现场。然后,我创建了迁移,并尝试修改此迁移以适当地更新组权限。但得到DoesNotExistRunPython操作。

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 django-models django-permissions django-migrations

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

如何将视图的访问权限限制为只有 Django 中的超级用户

在我用 Django 开发的网站上,我想限制对视图的访问,以便只有超级用户才能访问它们。我可以使用@login_requiredLoginRequiredMixin,但是我已经有一个普通人的登录系统,这样任何登录用户都可以访问该视图。

我尝试了一些我认为可以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)

谢谢你提供的所有帮助 :)

python django django-views django-permissions

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

Django 通道自定义权限系统

所以我有一个系统,用户可以通过模型成员成为称为框的模型的一部分。

成员模型有自己的一组角色,而这些角色又拥有自己的权限。

我有特定的方法来确定成员在框中拥有哪一组权限。

现在我有一个名为“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)

django django-permissions django-channels

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

在 Django Rest 框架 has_permission 中获取参数 pk 或 id 时出现问题

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')但它什么也没返回。

python django django-permissions django-rest-framework

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

检查模板中的用户权限(不是请求用户)

您好,有什么方法可以检查模板中自定义用户 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)

django django-templates django-permissions

0
推荐指数
1
解决办法
2116
查看次数