2012-05-28 67 views
1

我們正在構建一個帶有Oracle數據庫的Java EE/JPA/CDI應用程序。數據模型(這一點,我們不能改變)部分使用的意見和CLIENT_INFO ...像實現安全..如何使用EntityManager注入調用dbms_application_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); 
設置

現在,我們有了一系列無狀態Bean,它們基本上注入了持久化上下文並執行查詢(本地查詢和常規POJO),我們需要一種方法將客戶端信息(我們可以從安全上下文獲取)注入PersistenceContext在打電話給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()..這樣做的

一種方法很可能是使用攔截器和註釋的方法並在那裏打電話(假設我可以獲得該方法將使用的PersistenceContext ..)..這將甚至工作?

任何其他方式?

TIA!

回答

1

您正在撰寫的攔截器方法聽起來非常適合。

我不是100%肯定,如果我理解正確的您的要求,但它好像是一個好主意,從實際的業務邏輯中分離授權的邏輯才能寫出這樣的事:

...

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

IsEditor是一個攔截器,將封裝相關的數據庫查找。

Seam Security作爲一個獨立的CDI模塊帶有幾個概念(&實現),你應該肯定是check it out

+0

如果在Apache中DeltaSpike什麼(https://cwiki.apache.org/DeltaSpike/)會爲你工作,請使用DeltaSpike。 Seam 3不再被開發,所有的努力都被投入DeltaSpike。 – LightGuard

0

如果您使用的是EclipseLink,這裏有關於使用EclipseLink與Oracle VPD的一些信息,這看起來很相似。

從中你可以使用事件來執行你的呼叫。

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

+0

不幸的是,這不是一個選項,問題是我試圖連接到的應用程序是一個無法修改的第三方應用程序(Oracle EBS),它使用視圖處理其部分安全性,所以VPD記錄選項... – FMQ

相關問題