【问题标题】:pg-promise one connection per userpg-promise 每个用户一个连接
【发布时间】: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


【解决方案1】:

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

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

既然是我的错,我会尽力解释;-)。首先,要清楚,我 在安全方面工作(特别是访问控制和 RDBMS 安全) 但是对JS或者promise不是很熟悉。

我们的目标是通过辩护来实施最小特权原则 深入方法。在这种特殊情况下,这意味着发送的查询 非特权用户不应拥有数据库的管理员权限 边。 PostgreSQL 等 RDBMS 提供了非常强大、富有表现力和 久经考验的访问控制机制:RBAC、行级安全、 参数化视图等。实际上,这些控件通常完全 在使用范例“1 应用程序 == 1”的 Web 应用程序中被忽略 用户”,因此该用户具有管理员角色。但重度客户端经常使用 数据库端有几个不同的用户(每个最终用户一个 或每个特定角色一个),从而受益于访问控制 数据库。

来自数据库的访问控制是对网络访问控制的补充 应用。 webapp 中的 AC 会更精确,但可能 遭受一些错误; DB中的AC会更宽松一些,但 更好地执行,在出现应用程序错误时限制损失。

所以在我们的例子中,我们希望为每个应用程序用户创建一个 DB 用户。 然后,与数据库的连接属于该特定用户,并且 因此,数据库可以强制简单用户无法执行 admin 操作。一种中间可能性是放弃一些特权 在执行查询之前,但我们首选的方式是连接到 数据库作为当前登录的用户。登录密码由发送 用户进行身份验证时,我们只需将其传递给 DBMS。 可扩展性(还)不是我们应用程序的问题,我们可以牺牲 此类安全性具有一定的可扩展性。

您有什么提示可以帮助我们实现这一目标吗?

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

【讨论】:

猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2018-02-24
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多