Postgres Hibernate设置会话变量以提高行级安全性

时间:2019-09-16 18:23:47

标签: java postgresql hibernate

我无法找到有关我遇到的此问题的信息。我对在Postgres db上实现行级安全性感兴趣,我正在寻找一种方法,能够通过某种形式的拦截器自动设置postgres会话变量。现在,我知道使用hibernate可以使用@Filter@FilterDef进行行级安全,但是我想在数据库上另外设置策略。

一种非常简单的方法是在每次查询之前执行SQL语句SET variable=value,尽管我无法找到与此有关的任何信息。

此功能已在Spring Boot应用程序中使用,并且每个请求都有望访问variable的请求特定值。

1 个答案:

答案 0 :(得分:1)

由于您的应用程序使用spring,因此您可以尝试通过以下几种方式之一来实现此目的:

春季AOP

在这种方法中,您编写了一条建议,要求Spring将其应用于特定方法。如果您的方法使用@Transactional批注,则可以在交易开始后立即将建议应用于那些建议。

扩展的TransactionManager实施

让我们假设您的交易使用的是JpaTransactionManager

public class SecurityPolicyInjectingJpaTransactionManager extends JpaTransactionManager {
  @Autowired
  private EntityManager entityManager;

  // constructors

  @Override
  protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
    super.prepareSynchronization(status, definition);
    if (status.isNewTransaction()) {
      // Use entityManager to execute your database policy param/values

      // I would suggest you also register an after-completion callback synchronization
      // This after-completion would clear all the policy param/values
      // regardless of whether the transaction succeeded or failed 
      // since this happens just before it gets returned to the connection pool
    }
  }
}

现在,只需将JPA环境配置为使用自定义JpaTransactionManager类。


可能还有其他人,但这是我探索过的两个。