2010-11-18 7 views
1

私はデータベースとしてPostgreSQLを使用しており、マルチテナントアプリケーションのための私のミドルウェアとして3を使用しています。Intercept ActiveRecord establish_connection初期化プロセス

establish_connectionメソッドで作成されたすべての接続に対して、現在ログインしているクライアントIDを含む環境変数を設定したいと考えています。

私はこの環境変数を設定するためにestablish_connectionのコールバックを介して初期化プロセスを傍受することができますか?

+0

本当に達成したいことを記述できますか? 1つのアプリケーションが多くの異なるデータベースに接続する場合、env変数には何を設定しますか?あなたはなぜenv変数を設定したいですか? –

+0

申し訳ありませんが、何とか私のメールボックスにあなたのコメントを受け取りませんでした。うん、私は環境変数を設定することは悪い習慣だと考えました。基本的に私はすべてのクライアントアカウントのpostgresスキーマを構築して、データのプライバシーを確​​保しています。しかし、これは、現在のユーザーのclient_idに基づいて、ActiveRecord接続ごとにschema_search_pathを変更する必要があることを意味します。通常、私はモデルでセッション情報を使用するのが好きではありませんが、この場合、接続が確立されるたびにこの情報を使用する必要があります。これを行うためのきれいな方法がありますか? –

答えて

1

私は、アプリケーションレベルで、authority_levelフィールドのようなものでデータを分離する傾向があります。その後、 "verify_permission(current_user)"メソッドをbefore_filterとして実行できます。

通常、特権エスカレーションが発生したときに管理者に警告する目的で、自動的に強制的にログアウトと電子メールによる管理アラートを強要する「kick_user_out」メソッドがあります。あなたはそれらを十分に得て、アカウントもロックされます。

+0

あなたの答えをありがとう。私はまだdbレベルでクライアントデータを分離するのがより快適だと感じています。クライアントレベルでそれを維持すると、それぞれのクエリでclient_idフィルタが必要になることを意味します。不正なクエリは、セキュリティを危険にさらす可能性があります。私はそのような不正なクエリと、その後の権限レベルの問題についてもっと心配しています。 –