Hibernate 动态禁用休眠抓取

Hibernate 动态禁用休眠抓取,hibernate,Hibernate,我目前已经实现了行级安全性,其中需要安全的表具有所有者、组和Unix风格权限的列 当前的情况是,每当我们通过hibernate请求一个实体时,我们都会添加一个自定义标准来验证用户是否有权访问数据。每个create.Alias()上都会添加此自定义条件,以确保与其他表的联系也得到保护 问题是我们的模型有多个具有@manytone关系的实体,并且由于这些实体是自动获取的,因此没有办法保护嵌套实体 我要寻找的是一种方法: 使其仅获取通过create.Alias()添加的实体 或 对hibernate

我目前已经实现了行级安全性,其中需要安全的表具有所有者、组和Unix风格权限的列

当前的情况是,每当我们通过hibernate请求一个实体时,我们都会添加一个自定义标准来验证用户是否有权访问数据。每个create.Alias()上都会添加此自定义条件,以确保与其他表的联系也得到保护

问题是我们的模型有多个具有@manytone关系的实体,并且由于这些实体是自动获取的,因此没有办法保护嵌套实体

我要寻找的是一种方法:

  • 使其仅获取通过create.Alias()添加的实体

  • 对hibernate获取的内容进行动态控制

  • 这两种方式似乎并不意味着需要进行大规模的代码重构 我们项目的一部分

    这是可以做到的,还是有任何其他方法来加强我们的安全


    注:不幸的是,永远不返回嵌套实体是不可能的,因为它是客户端所需要的。我们还尝试使用max_fetch_depth 0,但即使在初始查询中没有请求嵌套实体,hibernate似乎会进行多个后续查询以完成实体。

    我处于研究阶段,但基本上没有将其用于我自己的项目,我相信这正是您想要的。如果我正确理解了文档,那么可以在模式中定义一个过滤器,在打开会话时以编程方式启用它并为其提供参数,并且在会话期间Hibernate将假装不通过过滤器的对象不存在。除了保护基于关系的回迁之外,这还将消除对每个查询手动添加安全检查的需要。

    谢谢您的回答。我们确实研究了过滤器,但不幸的是,似乎需要将这样一个过滤器添加到每个当前关系和未来关系中。这意味着,如果未来的程序员添加了几个其他模型,而忘记包含过滤器,那么实体将不安全。这似乎有点冒险。此外,目前我们对数据库的请求几乎都被重新组合到一个通用的“服务”类中,因此在每个查询上添加安全性不是问题。我不会说谎,我真的不知道这种情况,我认为hibernate过滤器可能确实是一个临时解决方案。但问题是,我似乎无法使用多个嵌套实体属性筛选实体。如果您在自己的项目中碰巧找到了解决此问题的方法,下面是我针对此问题发表的另一篇stackoverflow帖子:@jemag我正在处理它。过滤器越来越让我感到震惊,因为它只是一个半途而废的草率的想法的实现,而这个想法确实值得更多。它们在应用范围和可供筛选的可用属性范围方面都极为有限。