【问题标题】:How to call dbms_application_info with EntityManager injection如何使用 EntityManager 注入调用 dbms_application_info
【发布时间】:2012-05-28 15:59:41
【问题描述】:

我们正在使用 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!

【问题讨论】:

    标签: jpa cdi


    【解决方案1】:

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

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

    ...

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

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

    Seam Security 作为一个独立的 CDI 模块带有几个概念(和实现),你绝对应该check it out

    【讨论】:

    • 如果 Apache DeltaSpike (cwiki.apache.org/DeltaSpike) 中的内容适合您,请使用 DeltaSpike。 Seam 3 不再开发,所有的努力都在 DeltaSpike 上。
    【解决方案2】:

    如果您使用的是 EclipseLink,这里有一些关于将 EclipseLink 与 Oracle VPD 结合使用的信息,看起来很相似。

    本质上,您可以使用事件来执行调用。

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

    【讨论】:

    • 不幸的是,这不是一个选项,问题是我尝试连接的应用程序是无法修改的第三方应用程序(Oracle EBS),它使用以下方式处理其部分安全性意见,所以 VPD 是一个选项...
    猜你喜欢
    • 2011-01-26
    • 2011-12-15
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多