pg-承诺每个用户一个连接

亲爱的社区和活力希望,

我正在build立一个pg-promise的网站/服务器。 我使用postgreangular色/组login进行身份validation。

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

所以在实践中,我们为每个用户在连接时创build一个连接(如果它不存在的话)。 为此,我创build了一个带有丑陋的“假承诺”和一个pgUser对象的Pool对象:

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; }; 

下面是我在loginPOST处理期间如何将用户添加到“池”

  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; }); 

我相信这可能会刺激开发者,如果你能解释我最好的方法,

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

非常感谢你。

我已经联系了我的项目的安全负责人,做安全副教授(CITI实验室)的研究…这是他的评论:

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

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

我们的目标是贯彻“纵深防御”的最小特权原则。 在这种特殊情况下,这意味着非特权用户发送的查询不应具有数据库端的pipe理权限。 像PostgreSQL这样的RDBMS提供了非常强大的,有performance力的,经过充分testing的访问控制机制:RBAC,行级安全性,参数化视图等等。这些控制的确在Web应用程序中被完全忽略,这些应用程序使用范例“1 application == 1用户“,因此该用户具有pipe理员angular色。 但是,沉重的客户经常在数据库端使用几个不同的用户(每个最终用户或每个特定angular色),因此受益于数据库的访问控制。

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

所以在我们的例子中,我们要为每个应用程序用户创build一个DB用户。 然后,到数据库的连接属于这个特定的用户,因此数据库可以强制一个简单的用户不能执行pipe理操作。 中间的可能性是在执行查询之前删除一些特权,但是我们的首选方法是以当前login的用户连接到数据库。 login密码由用户在进行身份validation时发送,我们只是将其传递给DBMS。 可扩展性对我们的应用程序来说还不是一个问题,我们可以牺牲一些这种安全性的可伸缩性。

你有什么提示来帮助我们实现这个目标吗?

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