【发布时间】:2018-02-05 14:49:24
【问题描述】:
亲爱的社区,充满希望,
我正在使用 pg-promise 构建一个网站/服务器。 我使用 postgre 角色/组登录进行身份验证。
我不知道我做的是否正确,但我希望每个用户都使用他们自己的 postgres 连接来查询数据库。
所以在实践中,我会在每个用户连接时为他们创建一个连接(如果它不存在的话)。 为此,我创建了一个带有丑陋“虚假承诺”的 Pool 对象和一个 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;
});
我相信这会激怒专业开发者,如果您能以最好的方式解释我,您会很友善:
- 每个用户都有一个到数据库的连接是个好主意 (拥有良好的安全性似乎是合法的)?
- 如何更好地使用 pg-promise 库来避免这个丑陋的自定义“池”对象?
非常感谢。
【问题讨论】:
-
嗨,vitally-t。感谢您的及时回复。请您重新表述“这样的解决方案无法扩展,因为连接是需要共享的最有价值的资源,以便可扩展”,请。我想这样做是为了提高安全性。每个用户都应该有自己与 pg 的连接,不是吗?我在任何地方都找不到如何使用 postgres 处理多个用户。我的服务器中是否应该只有 1 个与 pg(管理员)的连接?我想用postgres的行安全级别功能。
-
@vitaly-t ,看起来网络上的所有示例都有一种用于所有查询的管理员密码和 ID,无论用户连接的是什么。我不明白如何使用 pg-promise 的行安全级别功能来做到这一点。要么我什么都不懂,要么我正在做一些以前从未做过的事情。
-
您好,我已经联系了我项目的安全负责人,正在研究安全副教授(CITI 实验室)...
-
@alexnode,我也有同样的问题。从我所读到的,所有的例子似乎都使用了一个独特的联系。对我来说,这在安全方面没有意义。我们应该能够为每个用户创建一个连接(使用他们的 id 和 pw)。否则,这将意味着可以访问您的服务器的人可以访问数据库......非常糟糕。我最终重置了 db 对象的 &cn 。但不确定这是否是好的做法。到目前为止它正在工作......
-
@alexnode,请让我知道你在这件事上的工作进展。出于安全目的,我也希望使用 4-5 个不同类型的用户(注册、未注册、管理员、员工等)。蒂亚
标签: node.js pg pg-promise