社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

django限制用户对相关对象的访问

user1330734 • 5 年前 • 1618 次点击  

我正在编写一个应用程序,它允许用户仅在其组织内验证和查看对象。对于一个 generic.ListView ,我可以用下面的代码限制访问权限:

模特儿

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    organisation = models.ForeignKey('Organisation', null=True, on_delete=models.CASCADE)

class Organisation(models.Model):
    name = models.CharField(max_length=255, unique=True, null=False, verbose_name="Name")

VIEW

class OrganisationList(LoginRequiredMixin, generic.ListView):
model = Organisation

def get_queryset(self):
    return Organisation.objects.filter(id=self.request.user.organisation.id)

除此视图外,用户还将访问需要此限制的表单、api和django管理接口。

例如,用户brett属于kids incorporated。当他登录到管理面板时,他目前还可以看到顶点公司,但不应该这样做。

User Brett should not see ACME Corporation

我已经看过了 ModelManager 接口,但我不确定如何获取用户请求和重写 有没有一种方法可以为所有视图运行一个查询(dry),以便用户只看到自己的组织?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43947
 
1618 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Raydel Miranda
Reply   •   1 楼
Raydel Miranda    6 年前

你应该用 groups and permissions 为此,每个组织一个组。只有某个群体的成员才能 阅读 (权限)组织组中的对象。

这将允许用户拥有多个组织,反之亦然。当然也不需要任何其他依赖。

user1330734
Reply   •   2 楼
user1330734    6 年前

有办法。

  1. 安装 django-crequest 包裹: https://github.com/Alir3z4/django-crequest#installing
  2. 创建一个 model.Manager 在models.py中并重写 get_queryset 方法

模特儿

...
from crequest.middleware import CrequestMiddleware

class UserOrganisationManager(models.Manager):
def get_queryset(self):
    request = CrequestMiddleware.get_request()
    return super().get_queryset().filter(id=request.user.organisation.id)


class Organisation(models.Model):
    name = models.CharField(max_length=255, 
                            unique=True, null=False, verbose_name="Name")
    ...
    objects = UserOrganisationManager()