2017-08-28 8 views
2

うれしく思います。pg-promiseユーザ1人当たりの接続

私は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を刺激する可能性があり、あなたが私に最善の方法を説明することができれば、あなたが親切だろうと確信しています:

  • は良いアイデアは、ユーザーごとにデータベースへの接続を1つ持っているということです (それは良いセキュリティを持っていることは正当だと思われます)?
  • どうすればpg-promiseライブラリを使ってこの醜いカスタム 'プール'オブジェクトを避けることができますか?

ありがとうございます。

+0

これはまったく表示されません。しかし、もし私がしたら、なぜあなたはこれを望んでいますか?そのようなソリューションは、スケーラビリティのために接続が共有する必要がある最も貴重なリソースであるため、拡張できません。あなたは目的に応じてあなたのサービスをハンディキャップしようとしています。 –

+0

こんにちはvitaly - t。あなたのプロンプトの返信をありがとう。接続はスケーラビリティのために共有する必要がある最も貴重なリソースなので、「そのようなソリューションは拡張できません」という言い方を変えてください。私はセキュリティを強化するためにそれをしたい。それぞれのユーザーはpgへの独自の接続を持つ必要がありますか?私はポストグルで複数のユーザーを扱う方法をどこにも見つけることができません。私はサーバにpg(admin)との接続が1つしかありませんか?私はpostgresの行のセキュリティレベルの機能を使用したいと思います。 – alexnode

+0

または、私はクエリを実行するたびに、ここであなたの例のグローバル接続変数を変更する必要がありますか? :https://stackoverflow.com/questions/8484404/what-is-the-properway-to-use-the-node-js-postgresql-module – alexnode

答えて

0

私はセキュリティで準profressor(CITIラボ)として研究を行って、私のプロジェクトの責任セキュリティに連絡してきた...ここに彼のコメントです:

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

私のせいだから、私は説明しようと思います;-)。まず、明確にするために、私は セキュリティ側(特にアクセス制御とRDBMSセキュリティ)で働いています しかし、JSや約束に慣れていません。

私たちの目標は、防御 の深いアプローチで最小特権の原則を実装することです。この特定のケースでは、特権のないユーザーが を送信したクエリに、データベース の管理者権限が与えられていないはずです。 PostgreSQLなどのRDBMSは、RBAC、行レベルのセキュリティ、 のパラメータ化されたビューなど、非常に強力で表現力豊かなアクセス制御メカニズムを提供します。これらのコントロールは、実際には、パラダイム「1」を使用するWebアプリケーションでは通常完全に ですアプリケーション== 1 ユーザー "、このユーザーはこのように管理者役割を持っています。しかし、大量のクライアントは、多くの場合、データベース側で 複数の異なるユーザー(最終ユーザー1人につき1人または特定のロールごとに1人)を使用して、 データベースのアクセス制御の恩恵を受けます。

DBからのアクセス制御は、Web アプリケーションのアクセス制御の追加です。 webappのACはより正確ですが、おそらく にいくつかのバグがあります。 DBのACはもう少しlaxistになりますが、 が適用され、アプリケーションのバグの場合の被害を制限します。

このケースでは、すべてのアプリケーションユーザーに対してDBユーザーを作成する必要があります。 その後、データベースへの接続はこの特定のユーザーに属し、 データベースは、管理者 操作を実行できないようにすることができます。クエリを実行する前にいくつかの特権を削除することが可能ですが、現在ログインしているユーザとして データベースに接続することをお勧めします。ログインパスワードは、ユーザーが によって認証されたときに送信され、DBMSに渡すだけです。 アプリケーションのスケーラビリティはまだ問題ではありません。 このタイプのセキュリティではスケーラビリティを犠牲にすることができます。

これを達成するためのヒントはありますか?

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

+0

これは特にpg-promiseに関係しないので、別の投稿で質問しています:https://stackoverflow.com/questions/46099931/webserver-with-database-one-connection-per -ユーザー – alexnode

関連する問題