java - Postgres Hibernate 设置 session 变量以实现行级安全性

标签 java postgresql hibernate

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

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

这是在 spring-boot 应用程序上使用的,每个请求都应该能够访问变量的请求特定值。

最佳答案

由于您的应用程序使用 spring,您可以尝试通过以下几种方法之一来完成此操作:

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 类。

<小时/>

可能还有其他的,但我想到的就是这两个。

关于java - Postgres Hibernate 设置 session 变量以实现行级安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57962473/

相关文章:

java - 无法访问类静态元素

java - 为什么没有 Java Charset setEncoding 方法?

SQL - 在子查询中选择特定条件

sql - PostgreSQL 声明具有显式数据类型的变量

Hibernate 和 JPA - 错误映射通过接口(interface)公开的嵌入式类

Java - Desktop.getDesktop().browse(URI) 受支持,但无法打开文档(Citrix 问题?)

java - Cloudinary Java直接上传BAD REQUEST错误

ruby-on-rails - 通过 Capistrano 部署 Rails Spree 应用程序后,在此服务器上找不到请求的 URL/登录名

hibernate - 获取数据时在 hibernate 状态下是否需要 `session.getTransaction().commit();`

java - Spring中使用@Query注解的原生查询