亲爱的社区和有希望的,有希望的,
我正在用pg-promise构建一个网站/服务器。我使用postgre角色/组登录进行身份验证。
我不知道我是否正确地做了这些事情,但我希望每个用户都使用自己的postgres连接来查询数据库。
所以在实践中,我为每个用户连接时创建了一个连接(如果它还没有存在)。为此,我创建了一个带有丑陋的“假承诺”和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;
};
以下是我在登录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;
});
我相信它可能会激怒专业开发人员,如果你能解释我最好的方法,你会很善良的:
真诚的,谢谢你。
我联系了负责我项目的安保人员,做了安全副教授(CITI实验室)的研究......这是他的评论:
====================
既然是我的错,我会尽力解释;-)。首先,要清楚,我在安全方面工作(特别是访问控制和RDBMS安全性),但对JS或承诺不是很熟悉。
我们的目标是通过深度防御方法实施最小特权原则。在这种特殊情况下,这意味着非特权用户发送的查询不应具有数据库端的管理权限。诸如PostgreSQL之类的RDBMS提供了非常强大,富有表现力和经过良好测试的访问控制机制:RBAC,行级安全性,参数化视图等。实际上,这些控件在使用范例“1 application ==”的Web应用程序中通常完全被忽略。 1个用户“,此用户具有管理员角色。但是,重型客户端通常在数据库端使用多个不同的用户(每个最终用户一个或每个特定角色一个),从而受益于数据库的访问控制。
来自DB的访问控制是Web应用程序中访问控制的补充。 webapp中的AC将更精确,但可能会遇到一些错误;数据库中的AC将更松懈但更好地执行,在应用程序错误的情况下限制损害。
因此,在我们的案例中,我们希望为每个应用程序用户创建一个DB用户。然后,与数据库的连接属于该特定用户,因此数据库可以强制简单用户不能执行管理操作。中间可能性是在执行查询之前删除某些权限,但我们首选的方法是以当前登录用户身份连接到数据库。登录密码由用户在进行身份验证时发送,我们只是将其传递给DBMS。可伸缩性对我们的应用程序来说不是一个问题,我们可以牺牲这种安全性的一些可伸缩性。
您有任何提示可以帮助我们实现这一目标吗?
==================