1

我们正在使用 Oracle 数据库构建 Java EE / 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);

现在,我们有一系列无状态 Bean,它们基本上注入 Persistence Context 并执行查询(本地查询和常规 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 ..).. 这甚至可以工作吗?

还有其他方法吗?

蒂亚!

4

2 回答 2

1

您所写的拦截器方法听起来非常合适。

我不是 100% 确定我是否正确理解了您的要求,但将授权逻辑与实际业务逻辑分离似乎是一个好主意,以便能够编写如下内容:

...

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

IsEditor是一个拦截器,将封装相关的数据库查找。

Seam Security 作为一个独立的 CDI 模块,带有几个概念(和实现),您一定要检查一下

于 2012-05-28T20:19:18.573 回答
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

于 2012-05-29T12:36:26.420 回答