应用程序用户在行级策略中:如何设置会话变量

时间:2017-08-09 19:49:50

标签: java spring postgresql jooq row-level-security

我正在尝试编写行级策略,在执行查询之前检查用户权限。在此上下文中,我需要能够在从连接池中获取连接时设置包含用户标识符的会话变量,并在将连接返回到池时取消设置/释放相同的会话变量。以下博客可能会给出一个很好的背景来解释我想要做的事情:https://blog.2ndquadrant.com/application-users-vs-row-level-security/

在我的设置中,我有以下图层:

  1. Hikari:HikariDataSource
  2. Spring:TransactionAwareDataSourceProxy(使用Hikari数据源),DataSourceTransactionManager(使用Hikary数据源)
  3. jOOQ:DataSourceConnectionProvider(使用Spring数据源),DefaultDSLContext
  4. 前两层仅限内部。也就是说,应用程序中的所有查询都是通过jOOQ完成的,即最后一层。

    因此,我需要能够在连接take from poolgive back to pool上实现回调。

    我一直在查看Hikari和Spring的文档,但找不到任何有用的东西。这可能是我的第一个问题:Hikari和/或Spring是否提供了这样的回调?

    我调查的下一步是jOOQ。我偶然发现了ExecuteListener。这是我的后续问题:ExecuteListener会成为一个很好的应用吗?这不会实现连接和返回时的实际点,但execution context在我的情况下可能已经足够好了(因为我的所有查询都是在jOOQ中完成的)?如果是,我应该实施startend函数吗?

1 个答案:

答案 0 :(得分:2)

这可以在当前堆栈的各个级别解决。以下是两条建议:

DataSource / Connection代理

中解决此问题

大多数连接池实现以下语义:

因此,您可以代理这两个API并在这些相关方法中实现所需的语义。这是一个更多的工作,但它将适用于任何JDBC客户端,包括jOOQ(即,当你不使用jOOQ它也将工作)

在jOOQ中解决此问题

如果您的所有数据库交互都通过jOOQ,您可以使用ConnectionProvider SPI直接使用jOOQ更轻松地解决此问题,ConnectionProvider.acquire()包含两个具有您所需语义的方法:

因此,您可以这样做,而不是使用jOOQ开箱即用的https://github.com/kossnocorp/jquery.turbolinks/issues/56

public class MyConnectionProvider implements ConnectionProvider {

    // Configure spring to inject your data source here
    @Autowire
    DataSource ds;

    @Override
    public Connection acquire() {
        try {
            Connection c = ds.getConnection();
            // Do your stuff here
            return c;
        }
        catch (SQLException e) {
            throw new DataAccessException("Something failed", e);
        }
    }

    @Override
    public void release(Connection c) {
        try {
            // Do your stuff here
            c.close();
        }
        catch (SQLException e) {
            throw new DataAccessException("Something failed", e);
        }
    }
}

您也可以使用ExecuteListener执行此操作,但上述方法肯定更简单。