1

Oracleデータベースを使用してJavaEE/ JPA/CDIアプリを構築しています。データモデル(これは変更できません)は、ビューとclient_infoを使用してセキュリティを部分的に実装します...のようなものです。

create view the_view
as select * 
from the_table
where organization_id = USERENV('CLIENT_INFO')

ここで、userenv('CLIENT_INFO')は、基本的に次の呼び出しによって設定されます。

dbms_application_info.set_client_info(11);

これで、基本的に永続コンテキストを挿入してクエリ(ネイティブクエリと通常のPOJOの両方)を実行する一連のステートレスBeanがあり、作成する前にクライアント情報(セキュリティコンテキストから取得できる)を永続コンテキストに挿入する方法が必要です。 EntityManagerへの呼び出し

一言で言えば、私はこれを呼び出すことができる必要があります。

@PersistenceContext 
EntityManager em;

@Inject
UserInfo userInfo;

public TheView getTableData(long id) {
    // At this point security Information should be set.. 
    // Call the query
    return em.find(TheView.class, id);

}

setClientInfo()を手動で呼び出す必要はありません。

これを行う1つの方法は、おそらくインターセプターを使用してメソッドに注釈を付け、そこで呼び出しを行うことです(メソッドが使用するPersistenceContextを取得できる場合...)これも機能しますか?

これを行う他の方法は??

TIA!

4

2 に答える 2

1

あなたが書いているインターセプターのアプローチは、素晴らしいフィット感のように聞こえます。

要件を正しく理解したかどうかは100%わかりませんが、承認ロジックを実際のビジネスロジックから切り離して、次のようなものを記述できるようにすることをお勧めします。

..。

@IsEditor("someMoreData")
public X getData() {
 ...
}

IsEditorはインターセプターであり、関連するDBルックアップをカプセル化します。

独立したCDIモジュールとしてのSeamSecurityには、いくつかの概念(および実装)が付属しています。ぜひチェックしてください

于 2012-05-28T20:19:18.573 に答える
0

EclipseLinkを使用している場合は、OracleVPDでのEclipseLinkの使用に関する情報がここにあります。これは似ているようです。

当然のことながら、イベントを使用して通話を実行できます。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Shared_and_Isolated#Oracle_Virtual_Private_Database_.28VPD.29

于 2012-05-29T12:36:26.420 に答える