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库来避免这个丑陋的自定义“池”对象?
非常感谢你。
我所接触的负责我的项目的安全,做研究,在安全(CITI实验室)副profressor ...这里是他的评论:
============= =======
既然是我的错,我会尽力解释;-)。首先,为了清楚起见,我在安全方面工作(特别是访问控制和RDBMS安全性) ,但我不太熟悉JS或承诺。
我们的目标是实施最小特权与防御 深入的方法原则。在这种特殊情况下,这意味着非特权用户发送的 查询不应具有数据库 一侧的管理权限。像PostgreSQL这样的RDBMS提供了功能非常强大,富有表现力和经过充分测试的访问控制机制:RBAC,行级安全性,参数化视图等等。这些控件实际上通常完全被 忽略,在使用范例“1应用程序== 1 用户“,因此此用户具有管理员角色。但重型客户端通常在数据库端使用几个不同的用户(每个最终用户为 或每个特定角色一个),因此受益于数据库的访问控制 。
来自DB的访问控制是对网络 应用程序中的访问控制的补充。在web应用程序中的AC将更加精确,但可能 遭受一些错误;数据库中的AC会稍微宽松一点,但会更好地执行,从而在应用程序错误的情况下限制损害。
所以在我们的情况下,我们想要为每个应用程序用户创建一个DB用户。 然后,与数据库的连接属于该特定用户,并且数据库因此可以强制执行简单用户不能执行管理操作。中间的可能性是在执行查询之前删除一些特权 ,但我们的首选方法是以当前登录的用户的身份连接到 数据库。当用户进行身份验证时,登录密码由 发送,我们只是将它传递给DBMS。 可伸缩性对于我们的应用程序还不是(至今)的问题,我们可以牺牲 这种安全性的一些可伸缩性。
你有什么提示可以帮助我们实现吗?
==================
我问另一篇文章的问题,因为这不涉及特别是pg-promise:https://*.com/questions/46099931/webserver-with-database-one-connection-per -用户 – alexnode
这看起来并不正确。但是,如果我可以,为什么要这样?这样的解决方案无法扩展,因为连接是需要共享的最宝贵的资源,以便可扩展。您正在努力阻止您的服务。 –
嗨,重要。感谢您的promp答复。您能否重新翻译“这样的解决方案无法扩展,因为连接是需要共享的最有价值的资源,以便可扩展”。我想这样做是为了增加安全性。每个用户都应该有自己的pg连接,不是吗?我找不到如何使用postgres处理多个用户。我应该在我的服务器中只有1个连接到pg(admin)吗?我想使用postgres的行安全级别函数。 – alexnode
或每次我想执行一个查询时,我需要在这里更改您的示例的全局连接变量? :https://*.com/questions/8484404/what-is-the-proper-way-to-use-the-node-js-postgresql-module – alexnode