Cum se apelează dbms_application_info cu injecție EntityManager

Construim o aplicație Java EE/JPA/CDI cu o bază de date Oracle. Modelul de date (acest lucru nu se poate schimba) implementează securitatea parțial prin utilizarea vizualizărilor și a clientului ... ceva de genul ..

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

unde userenv ('CLIENT_INFO') este stabilit prin apel

dbms_application_info.set_client_info(11);

Acum, avem o serie de fasole fără stat care practic injectează Contextul de Persistență și execută interogări (ambele interogări native și POJO obișnuite) și avem nevoie de o modalitate de a injecta informațiile despre client (pe care le putem obține din contextul de securitate) în PersistenceContext înainte de a face apeluri către EntityManager

pe scurt, trebuie să fiu în stare să spun asta ..

@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);

}

fără a trebui să apelați manual un setClientInfo ().

O modalitate de a face acest lucru ar fi, probabil, folosind interceptoare și adnota metoda și de a face apel acolo (cu condiția să mă pricep la PersistenceContext că metoda va folosi ..) .. va funcționa chiar acest lucru?

Orice alt mod de a face asta?

TIA!

0

2 răspunsuri

Dacă utilizați EclipseLink, există informații despre utilizarea EclipseLink cu Oracle VPD, care pare a fi similară.

Din punct de vedere fizic, puteți utiliza evenimente pentru a vă executa apelul.

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

0
adăugat
Din păcate, aceasta nu este o opțiune, problema este că aplicația la care încerc să mă conectez este o aplicație terță parte care nu poate fi modificată (Oracle EBS) care se ocupă de o parte a securității prin vizualizări, deci VPD este o opțiune ...
adăugat autor FMQ, sursa

Abordarea interceptorului pe care o scrieți despre sunete se potrivește excelent.

Nu sunt 100% sigură dacă am înțeles corect cerințele dvs., dar se pare că ar fi o idee bună să decuplați logica de autorizare de logica de afaceri reală pentru a putea scrie ceva de genul:

...

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

IsEditor is an interceptor and will encapsulate the relevant DB lookup.

Seam Security as an independent CDI modules comes with a couple of concepts (& implementations), you should definitely check it out.

0
adăugat
Dacă ceea ce este în Apache DeltaSpike ( cwiki.apache.org/DeltaSpike ) va funcționa pentru dvs., vă rugăm să utilizați DeltaSpike. Seamă 3 nu mai este în curs de dezvoltare și toate eforturile sunt puse în DeltaSpike.
adăugat autor LightGuard, sursa