【问题标题】:Hibernate: apply filtering by certain column for all requests to databaseHibernate:对数据库的所有请求应用特定列的过滤
【发布时间】:2016-06-14 23:09:37
【问题描述】:

在我的数据库中,我有属于不同用户的数据。 在代码中,对数据库的请求是通过不同的方式发出的:

  • 使用标准:

    • 从代码中的一处(公共父 DAO)

    • 来自代码中的许多地方(子 DAO)

  • 使用 HQL 查询:

    • 同样的两种方法

现在,我想确定的是,任何程序员,无论他以何种方式向 DB 发出请求,都不会犯错误而忘记通过 user_id 从任何表中过滤数据。该值是当前用户的id。 (如果一个表没有这样的列,这意味着它的数据应该可供所有用户访问,那么应该忽略过滤)。

理想情况下,这种过滤将在更深层次的某个地方自动执行,而不是在我们编写和重写的代码中。有可能吗?

【问题讨论】:

  • 您能详细说明一下吗?程序员可以通过查询或验证实体类来检查表是否有user_id列。
  • @Lathy 问题程序员对一个实体类(每个)有一些事情要做 - 验证查询。他可能会忘记这样做。错误的代价——侵犯用户数据安全。
  • 获取当前正在使用的实体类的元数据,这将为您提供其中使用的属性,您可以迭代属性以查找该实体是否具有 user_id 并根据结果您可以应用过滤器。
  • 上面也可以借助interceptors/aop进行泛化
  • @Lathy 非常概括是我问题的主题。

标签: java hibernate hql hibernate-criteria


【解决方案1】:

你可以这样做,

  1. 创建一个扩展 EmptyInterceptor 的名为 UserInterceptor 的类
  2. 覆盖 getEntityName 方法。
  3. 获取实体类元数据。 (您可以将 sessionFactory 注入 EmptyInterceptor)。
  4. 获取属性并对其进行迭代并获取 user_id
  5. 重写 onSave 方法并在 HQL 生成的最终查询中检查 user_id。

这可能不是理想的解决方案,但这样我们可以满足您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2021-05-08
    • 2021-10-29
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多