我们正在使用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基本上注入持久化上下文和执行查询(本机查询和常规POJO),我们需要一种方法将客户端信息(我们可以从安全上下文中获取)注入到在调用EntityManager之前的PersistenceContext
简而言之,我需要能够称之为..
@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!
答案 0 :(得分:1)
您正在撰写的拦截器方法听起来非常合适。
如果我正确理解您的要求,我并不是百分之百确定,但似乎将授权逻辑与实际业务逻辑分离以便能够编写如下内容似乎是个好主意:
...
@IsEditor("someMoreData")
public X getData() {
...
}
IsEditor
是一个拦截器,将封装相关的数据库查找。
Seam Security作为一个独立的CDI模块附带了几个概念(和实现),你绝对应该check it out。
答案 1 :(得分:0)
如果您正在使用EclipseLink,那么有一些关于将EclipseLink与Oracle VPD一起使用的信息,这看起来很相似。
在某种程度上,您可以使用事件来执行通话。