当前位置 : 主页 > 网页制作 > Nodejs >

node.js – pg-保证每个用户一个连接

来源:互联网 收集:自由互联 发布时间:2021-06-16
亲爱的社区和有希望的,有希望的, 我正在用pg-promise构建一个网站/服务器. 我使用postgre角色/组登录进行身份验证. 我不知道我是否正确地做了这些事情,但我希望每个用户都使用自己的
亲爱的社区和有希望的,有希望的,

我正在用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;
        });

我相信它可以激怒专业开发人员,如果你能解释我最好的方法,你会很善良的:

>每个用户有一个与数据库的连接是个好主意
(拥有良好的安全性似乎合法)?
>如何更好地使用pg-promise库来避免这个丑陋的自定义“池”对象?

真诚地感谢你.

我联系了负责我项目的安保人员,做了安全副研究员(CITI实验室)的研究……这是他的评论:

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

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

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

来自DB的访问控制是Web中访问控制的补充
应用. webapp中的AC将更精确,但可能
遭受一些错误; DB中的AC会有点松弛但是
更好地执行,在应用程序错误的情况下限制损害.

因此,在我们的案例中,我们希望为每个应用程序用户创建一个DB用户.
然后,与数据库的连接属于此特定用户和
因此,数据库可以强制简单的用户无法执行admin
操作.中间可能性是放弃一些特权
在执行查询之前,我们首选的方法是连接到
数据库作为当前登录的用户.登录密码由发送
用户在进行身份验证时,我们只是将其传递给DBMS.
可伸缩性对我们的应用程序来说不是一个问题,我们可以牺牲
这种安全性的一些可扩展性.

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

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

网友评论