gpt4 book ai didi

filter - 为 sqlalchemy 查询预过滤用户访问权限的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 15:02:44 24 4
gpt4 key购买 nike

我一直在他们的 wiki 上查看 sqlalchemy 食谱,但不知道哪一个最适合实现我正在尝试做的事情。

我表中的每一行都有一个与之关联的 user_id。现在,对于每一个查询,我都是通过当前登录的用户的 id 进行查询,然后根据我感兴趣的条件进行查询。我担心的是开发人员可能会忘记将这个过滤器添加到查询中(一个巨大的安全风险)。因此,我想根据当前用户的管理员权限设置一个全局过滤器,以过滤登录用户可以看到的内容。

感谢你的帮助。谢谢。

最佳答案

下面是简化的重新定义的查询构造函数,用于过滤所有模型查询(包括关系)。您可以将其传递给 query_cls sessionmaker 的参数.用户 ID 参数不需要是全局的,只要在 session 可用时构建 session 。

class HackedQuery(Query):

def get(self, ident):
# Use default implementation when there is no condition
if not self._criterion:
return Query.get(self, ident)
# Copied from Query implementation with some changes.
if hasattr(ident, '__composite_values__'):
ident = ident.__composite_values__()
mapper = self._only_mapper_zero(
"get() can only be used against a single mapped class.")
key = mapper.identity_key_from_primary_key(ident)
if ident is None:
if key is not None:
ident = key[1]
else:
from sqlalchemy import util
ident = util.to_list(ident)
if ident is not None:
columns = list(mapper.primary_key)
if len(columns)!=len(ident):
raise TypeError("Number of values doen't match number "
'of columns in primary key')
params = {}
for column, value in zip(columns, ident):
params[column.key] = value
return self.filter_by(**params).first()


def QueryPublic(entities, session=None):
# It's not directly related to the problem, but is useful too.
query = HackedQuery(entities, session).with_polymorphic('*')
# Version for several entities needs thorough testing, so we
# don't use it yet.
assert len(entities)==1, entities
cls = _class_to_mapper(entities[0]).class_
public_condition = getattr(cls, 'public_condition', None)
if public_condition is not None:
query = query.filter(public_condition)
return query

它仅适用于单个模型查询,并且需要做很多工作才能使其适用于其他情况。我希望看到一个详细的版本,因为它必须具有大多数 Web 应用程序的功能。它使用存储在每个模型类中的固定条件,因此您必须根据需要对其进行修改。

关于filter - 为 sqlalchemy 查询预过滤用户访问权限的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2885415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com