2

Postgres Advanced Server バックエンドに関連付けられた Spring 3.2.1 と Hibernate 4.1.9 を使用して Java Web アプリケーションを開発しています (行レベルのセキュリティのため)。私が解決しようとしている問題は、webapp ログイン ユーザーを Hibernate セッションに関連付ける方法です。具体的には、ユーザー A がログインする場合、データベースへの webapp 接続で A' 資格情報を使用する必要があります (その場合にのみ、A が表示/変更する権限を持つレコードをフィルター処理できます)。Webapp とデータベースのユーザーは、同じ LDAP サーバーに対して検証されます。

私の設定情報は次のとおりです。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="annotatedClasses">
        <list>
            <value>com.mycom.proj.model.A</value>
            <value>com.mycom.proj.model.B</value>
            <value>com.mycom.proj.model.C</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${db.hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>

上記の構成に基づいて、dataSource および sessionFactory Bean はシングルトンです。

私が取ることができる 1 つのアプローチは、dataSource と sessionFactory を「セッション」スコープに設定することです。以下の理由から、私はそのアプローチを取ることをためらっています。

a) データベース接続がセッション スコープにある場合、接続プールを利用できません。(私はそれと一緒に暮らす必要があるかもしれないと思います) b) sessionFactory をセッションスコープに設定すると、Hibernate のキャッシュメカニズムが台無しになるのではないかと心配しています。

この問題を解決する方法についての考え/アイデアはありますか?

前もって感謝します。

4

2 に答える 2

2

もう 1 つの方法はNOINHERIT、すべてのユーザー ロールのメンバーシップを持つ非特権ユーザーとしてすべての接続を確立することです。SET ROLEクエリを実行する前に、ログインしているユーザーにアクセスします。プログラミングエラーが原因で失敗した場合SET ROLE、接続している権限のないユーザーに権限を付与しておらず、権限を継承していないため、何もできないため、被害は最小限に抑えられます。

サーブレット フィルター (リクエスト全体に対して 1 つの接続を使用する場合)、CDI インターセプター、接続プールのラッパー、接続プールの実装によって提供されるフック、またはその他のさまざまなオプションを使用して、これを行うのは非常に簡単です。常に起こります。

SET SESSION AUTHORIZATION代わりに使用できればいいのですが、それにはスーパーユーザー接続が必要です。権限を減らすだけの場合でも、アプリケーションでスーパーユーザー接続を使用することはお勧めしません。1 つの間違いが非常に深刻な結果をもたらす可能性があります。

これについては、少し前に DBA の質問に答えて、さらに詳しく書きました

于 2013-03-11T22:50:54.500 に答える
1

通常、接続プールはユーザーごとにプールされた接続を処理するため、getConnection()呼び出しをにリダイレクトするためのアダプターのみが必要getConnection(user, passwd)です。

Springは1つを提供します。以下を参照してください。org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter

たとえば、ログインフィルタのDatasourceviaメソッドにクレデンシャルを設定できます。setCredentialsForCurrentThread()

于 2013-03-11T20:48:41.327 に答える