希望亲爱的社区和活力,
我正在使用 pg-promise 构建网站/服务器。 我使用 postgre 角色/组登录进行身份验证。
我不知道我做的事情是否正确,但我希望每个用户都使用他们自己的 postgres 连接来查询数据库。
所以在实践中,我会在每个用户连接时为他们创建一个连接(如果它尚不存在)。 为此,我创建了一个带有丑陋“虚假 promise ”的 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 库来避免这种丑陋的自定义“池”对象?
衷心感谢。
最佳答案
我已经联系了我的项目的安全负责人,作为安全副教授(CITI 实验室)进行研究......这是他的评论:
====================
既然是我的错,我会尽力解释;-)。首先要明确的是,我 在安全方面工作(特别是访问控制和 RDBMS 安全) 但对 JS 或 promises 不是很熟悉。
我们的目标是通过防御实现最小特权原则 深入的方法。在这种特殊情况下,这意味着发送的查询 非特权用户不应拥有数据库的管理员权限 边。诸如 PostgreSQL 之类的 RDBMS 提供了非常强大、富有表现力和 经过良好测试的访问控制机制:RBAC、行级安全性、 参数化 View 等。实际上,这些控件通常完全 在使用范例“1 application == 1 用户”,因此该用户具有管理员角色。但是重度客户经常使用 数据库端的几个不同用户(每个最终用户一个 或每个特定角色一个),从而受益于访问控制 数据库。
来自数据库的访问控制是对网络访问控制的补充 应用。 webapp 中的 AC 会更精确,但可能 遭受一些错误;数据库中的 AC 会更宽松一些,但 更好地执行,在应用程序错误的情况下限制损失。
所以在我们的例子中,我们想为每个应用程序用户创建一个数据库用户。 然后,到数据库的连接属于这个特定的用户,并且 数据库因此可以强制一个简单的用户不能执行管理员 操作。一种中间的可能性是放弃一些特权 在执行查询之前,但我们首选的方式是连接到 数据库作为当前登录的用户。登录密码由 用户在他进行身份验证时,我们只是将其传递给 DBMS。 可扩展性对我们的应用程序来说(还)不是问题,我们可以牺牲 此类安全性的一些可扩展性。
您有什么提示可以帮助我们实现这一目标吗?
==================
关于node.js - pg-promise 每个用户一个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917207/