Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:自定义默认管理器,具有针对所有视图/界面(自定义、管理、graphene、rest等)的基于用户的查询_Django_Django Models_Django Managers - Fatal编程技术网

Django:自定义默认管理器,具有针对所有视图/界面(自定义、管理、graphene、rest等)的基于用户的查询

Django:自定义默认管理器,具有针对所有视图/界面(自定义、管理、graphene、rest等)的基于用户的查询,django,django-models,django-managers,Django,Django Models,Django Managers,在Django中,我试图实现某种“安全中间件”,它只允许在登录用户匹配的情况下访问某些db信息 到目前为止,我发现了两种方法:中间件或manager中的自定义函数(都在这里解释) 最干净的解决方案示例:自定义函数 class UserContactManager(models.Manager): 用户的def(自身、用户): 返回self.get\u query\u set().filter(创建者=用户) 类MyUser(models.Model): #管理者 对象=UserContactMa

在Django中,我试图实现某种“安全中间件”,它只允许在登录用户匹配的情况下访问某些db信息

到目前为止,我发现了两种方法:中间件或manager中的自定义函数(都在这里解释)

最干净的解决方案示例:自定义函数

class UserContactManager(models.Manager):
用户的def(自身、用户):
返回self.get\u query\u set().filter(创建者=用户)
类MyUser(models.Model):
#管理者
对象=UserContactManager()
#然后在视图中像这样使用它
data=MyUser.objects.for_user(request.user)
但是,只有在您能够控制调用此自定义函数的代码时,此解决方案才有效(此处:
for_user()
)。 但是,如果您使用的是第三方应用程序,如Django REST、Graphene或AdminView,则它们无法配置要使用的特定查询函数

我的目标是:
  • 替换默认的管理器
  • 将基于用户的筛选器添加到查询集
  • 在所有应用程序配置中正常使用该型号
  • Idea(伪代码!)

    从django.x导入当前用户
    类UserBasedManager(models.Manager):
    def get_queryset(自我):
    return super().get_queryset().filter(author=current_user.name)
    教材(models.Model):
    title=models.CharField(最大长度=100)
    作者=models.CharField(最大长度=50)
    objects=UserBasedManager()#默认管理器。
    
    现在,我可以像在所有扩展中一样正常使用模型
    Book

    我知道这个解决方案会有一些缺点,这对我来说是可以的:

    • 只能在用户可用时使用(例如,不支持直接脚本)
    • 缺少处理no或匿名用户(将其保留以保持示例简短)
    我的用例 我有一个项目,它将通过不同的接口(管理页面、自定义视图、rest、graphql)访问数据。 由于我有这么多接口,我不想在视图中实现访问权限。这将花费太多的时间,并且很难维护,并且在一个特定视图/接口中出现安全问题的风险太高

    假设我将git存储库的提交存储在数据库中。 并且用户应能够访问所有提交,这些提交是用户具有读取权限的repos的一部分

    问题是:如何将其实现为一个通用的、独立于视图/界面的解决方案?

    安装软件包并调用get\u current\u user函数以获取当前用户

    from threadlocals.threadlocals import get_current_user
    
    class UserBasedManager(models.Manager):
        def get_queryset(self):
            current_user = get_current_user()
            return super().get_queryset().filter(author=current_user.name)