pg-promise每个用户一个连接

问题描述:

亲爱的社区和有希望的,pg-promise每个用户一个连接

我正在建立一个网站/服务器pg-promise。 我使用postgre角色/组登录进行身份验证。

我不知道我是否正确地做了这些事情,但我希望每个用户都使用自己的postgres连接来查询数据库。

因此,在实践中,我们为每个用户在连接时创建连接(如果它尚不存在)。 要做到这一点,我创建了一个池对象与一个丑陋的“假承诺”和PGUSER对象:

var pgPool = function(pg){ 
    var _this=this; 
    var fakePromise = function(err){ 
     var _this=this; 
     _this.err=err 
     _this.then=function(cb){if(!err){cb();return _this}else{return _this};}; 
     _this.catch=function(cb){if(err){cb(_this.err)}else{return _this};}; 
     return _this; 
      }; 

    _this.check= function(user){ 
     if (_this[user]){ 
      return _this[user].check(); 
     }else{ 
      return new fakePromise({error:'Echec de connection à la base de 
      données'}) 
     } 


    } 
    _this.add = function(user,password){ 
     var c={}; 
     c.host = 'localhost'; 
     c.port = 5432; 
     c.database = 'pfe'; 
     c.poolSize = 10; 
     c.poolIdleTimeout = 30000; 
     c.user=user; 
     c.password=password 
     if (!_this[user]){ 
      _this[user] = new pgUser(c,pg); 
      return _this[user].check(); 
     }else{ 
      _this[user].config.password=password; 
      return _this[user].check(); 
     }; 
    }; 
    return _this; 
}; 

var pgUser = function(c,pg){ 
    var _this=this 
    _this.config = c  
    _this.db = new pg(_this.config) 
    _this.check = function(){ 
     return _this.db.connect(); 
    }; 
    return _this; 
}; 

这里是我如何登录POST处理过程中添加一个用户到“池”

pool.add(req.body.user,req.body.password).then(function(obj){ 
      obj.done(); 
      req.session.user = req.body.user; 
      req.session.password = req.body.password; 
      res.redirect("/"); 
      return; 
     }).catch(function(err){ 
      options.error='incorect password/login'; 
      res.render('login', options); 
      return; 
     }); 

我相信它会刺激亲developpers,你会是怎样,如果你能解释我的最佳方式:

  • 是一个好主意,有一个连接到每个用户数据库(拥有良好的安全性似乎是合法的)?
  • 如何更好地使用pg-promise库来避免这个丑陋的自定义“池”对象?

非常感谢你。

+0

这看起来并不正确。但是,如果我可以,为什么要这样?这样的解决方案无法扩展,因为连接是需要共享的最宝贵的资源,以便可扩展。您正在努力阻止您的服务。 –

+0

嗨,重要。感谢您的promp答复。您能否重新翻译“这样的解决方案无法扩展,因为连接是需要共享的最有价值的资源,以便可扩展”。我想这样做是为了增加安全性。每个用户都应该有自己的pg连接,不是吗?我找不到如何使用postgres处理多个用户。我应该在我的服务器中只有1个连接到pg(admin)吗?我想使用postgres的行安全级别函数。 – alexnode

+0

或每次我想执行一个查询时,我需要在这里更改您的示例的全局连接变量? :https://*.com/questions/8484404/what-is-the-proper-way-to-use-the-node-js-postgresql-module – alexnode

我所接触的负责我的项目的安全,做研究,在安全(CITI实验室)副profressor ...这里是他的评论:

============= =======

既然是我的错,我会尽力解释;-)。首先,为了清楚起见,我在安全方面工作(特别是访问控制和RDBMS安全性) ,但我不太熟悉JS或承诺。

我们的目标是实施最小特权与防御 深入的方法原则。在这种特殊情况下,这意味着非特权用户发送的 查询不应具有数据库 一侧的管理权限。像PostgreSQL这样的RDBMS提供了功能非常强大,富有表现力和经过充分测试的访问控制机制:RBAC,行级安全性,参数化视图等等。这些控件实际上通常完全被 忽略,在使用范例“1应用程序== 1 用户“,因此此用户具有管理员角色。但重型客户端通常在数据库端使用几个不同的用户(每个最终用户为 或每个特定角色一个),因此受益于数据库的访问控制 。

来自DB的访问控制是对网络 应用程序中的访问控制的补充。在web应用程序中的AC将更加精确,但可能 遭受一些错误;数据库中的AC会稍微宽松一点,但会更好地执行,从而在应用程序错误的情况下限制损害。

所以在我们的情况下,我们想要为每个应用程序用户创建一个DB用户。 然后,与数据库的连接属于该特定用户,并且数据库因此可以强制执行简单用户不能执行管理操作。中间的可能性是在执行查询之前删除一些特权 ,但我们的首选方法是以当前登录的用户的身份连接到 数据库。当用户进行身份验证时,登录密码由 发送,我们只是将它传递给DBMS。 可伸缩性对于我们的应用程序还不是(至今)的问题,我们可以牺牲 这种安全性的一些可伸缩性。

你有什么提示可以帮助我们实现吗?

==================

+0

我问另一篇文章的问题,因为这不涉及特别是pg-promise:https://*.com/questions/46099931/webserver-with-database-one-connection-per -用户 – alexnode