应用程序级别用户如何利用 Postgres RLS?

问题描述 投票:0回答:1

我想构建一个考虑到可扩展性的应用程序,并使用 postgres RLS 进行用户授权

  1. 我有一个 Node JS 和 Express 服务器
  2. 我有一个到 postgres 实例的续集连接,并设置了连接池
const sequelize = new Sequelize({
 database: 'your_database',
 username: 'your_username',
 password: 'your_password',
 host: 'your_host',
 dialect: 'postgres',
 pool: {
   max: 10,
   min: 0,
   acquire: 30000,
   idle: 10000,
 },
});
export default sequelizeClient;
  1. 对于我的 API,我有读取 JWT 的中间件
  2. 解析此 JWT 后,我得到用户角色和用户 ID
  3. 现在要利用 Postgres RLS,我正在考虑做一个
await sequelize.query(`SET ROLE ${userRole}`);
await sequelize.query('SET LOCAL jwt.claims.userId = :userId', {
      replacements: { userId },
    });

其中 userId 和 userRole 来自中间件中解析的 JWT 6. 然后继续执行该 API 的所有 SQL 查询,该 sql 角色和局部变量将在 RLS 策略中使用来授权或拒绝该操作

此类 API 的示例代码:

async function getUserData(userId, userRole) {
  try {
    await sequelize.query(`SET ROLE ${userRole}`);
    await sequelize.query('SET LOCAL jwt.claims.userId = :userId', {
      replacements: { userId },
    });

    // Perform your Sequelize operations
    const userData = await User.findByPk(userId, { raw: true });
    return userData;
  } catch (err) {
    console.log('ERROR: ', err);
 }
}

现在我的问题如下:

  1. SET LOCAL 变量是否有可能干扰两个不同用户的 同时调用 API?
  2. 将sequelize确保后续查询(设置本地、角色和用户查找查询) 会在连接池的同一个连接中执行吗?
  3. 当一个 API 正在处理时,来自不同 API 的两个不同 API 查询最终能否使用相同的连接?
  4. Sequelize 是否为每个单独的查询请求连接池中的连接?

我知道supabase做了类似的事情,但我想要自己的后端服务器,但如果有一种方法可以利用supabase提供的supervisor来实现类似的功能,也请建议。

此外,如果有更好、更可靠的方法来处理这个问题,请提出建议。谢谢你

node.js postgresql sequelize.js supabase
1个回答
0
投票

根据我对源代码的理解:

当您使用sequelize.query发出请求时:

1 从连接池中获取连接

执行2个查询

3 个连接被释放回池中

如果达到 useCount,则 3 个连接将被破坏 请参阅 options.pool.maxUses

3b 连接可供进一步使用 请参阅 sequelize-pool/blob/master/src/Pool.ts#L455

基于此:

SET LOCAL 变量是否有可能干扰两个不同用户同时进行的 API 调用?

不可以,一旦连接被获取,在释放之前就无法获取。然而,如果您不清理它,进一步的连接使用可能会重复使用您设置的本地。

sequelize 会确保后续查询(设置本地、角色和用户查找查询)将在连接池中的同一个连接中执行吗?

不可以,除非以成本价使用事务,但它会阻止释放您的连接,直到提交为止。这可能会降低应用程序的整体性能,并导致创建更多连接,从而影响数据库性能。

当一个 API 正在处理时,来自不同 API 的两个不同 API 查询最终能否使用相同的连接?

我猜与第一点相同

Sequelize 是否为每个单独的查询请求连接池中的连接?

是的

© www.soinside.com 2019 - 2024. All rights reserved.