0

我想在我的 Web 应用程序中使用“Oracle 代理身份验证” 。我使用 JPA 框架进行持久性和 eclipselink 作为 JPA 提供程序。

我正在使用的代码是

        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("eclipselink.oracle.proxy-type", oracle.jdbc.OracleConnection.PROXYTYPE_USER_NAME);
        properties.put(oracle.jdbc.OracleConnection.PROXY_USER_NAME, "egonzalez");
        properties.put("eclipselink.jdbc.exclusive-connection.mode", "Always");
        properties.put("eclipselink.jdbc.exclusive-connection.is-lazy", "false");       


        em = emf.createEntityManager(properties);       

当我在不使用数据源的情况下定义持久性单元时,它工作正常。

    <properties>                           
        <property name="eclipselink.logging.level" value="FINE"/>
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@10.12.54.210:1523:dsr" />
        <property name="javax.persistence.jdbc.user" value="unificado" />
        <property name="javax.persistence.jdbc.password" value="asdas" />
        <property name="eclipselink.cache.shared.default" value="false"/>
    </properties>

但是当我通过数据源定义持久单元时,它不起作用。

    <properties> 
        <property name="eclipselink.session.customizer" value="com.ieci.mugeju.middleware.model.util.JPAEclipseLinkSessionCustomizer"/>
        <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"/>
        <property name="javax.persistence.nonJtaDataSource" value="java:/OracleDS"/>
        <property name="eclipselink.logging.level" value="FINEST"/>  
        <property name="eclipselink.cache.shared.default" value="false"/>
    </properties>

我正在使用 JBoss 4.2.3。

4

1 回答 1

0

我已经尝试过 Olaf Heimburger 的文章中解释的内容: Using Oracle Proxy Authentication with JPA (EclipseLink-Style)。但我不确定为什么这个解决方案对我不起作用。我正在使用 Oracle Dababase 10g、JBoss 7.1.1 和 EclipseLink 2.5.1 提供程序,我选择的应用程序架构是带有 EJB 注入和容器管理实体管理器(事务范围)的 JSF 2.0 Web 应用程序。

因为我花了很多时间寻找 Oracle 代理身份验证解决方案,所以我将解释我所做的。

我在我的应用程序中定义并配置了一个 SessionEventAdapter (org.eclipse.persistence.sessions.SessionEventAdapter)。

public class ProxyAuthenticationSessionEventListener extends
    SessionEventAdapter
{   

  @Override
  public void postAcquireConnection(SessionEvent event)
  {
    DatabaseAccessor da = (DatabaseAccessor)event.getResult();

    OracleConnection oracleConn =  null;
    try
    {
      WrappedConnection wrappedConn = (WrappedConnection)  da.getConnection();
      Connection underlyingConn = wrappedConn.getUnderlyingConnection();        
      oracleConn = (OracleConnection)underlyingConn;
      if (!oracleConn.isProxySession())
      {
          java.util.Properties prop = new java.util.Properties();
          prop.put(OracleConnection.PROXY_USER_NAME, user);
          prop.put(OracleConnection.PROXY_USER_PASSWORD, password);
          oracleConn.openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop);
      }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }                       
  }

  @Override
  public void preReleaseConnection(SessionEvent event)
  {
    DatabaseAccessor da = (DatabaseAccessor)event.getResult();

    OracleConnection oracleConn =  null;
    try
    {
      WrappedConnection wrappedConn = (WrappedConnection)  da.getConnection();
      Connection underlyingConn = wrappedConn.getUnderlyingConnection();        
      oracleConn = (OracleConnection)underlyingConn;

      if (oracleConn.isProxySession())
      {
        oracleConn.close(OracleConnection.PROXY_SESSION);
      }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }               
  }
}

可以通过 ThreadLocal 在 SessionEventAdapter 中接收用户和密码。

在 persistence.xml 文件中:

<property name="eclipselink.session-event-listener" value="example.ProxyAuthenticationSessionEventListener"/>

这个解决方案是基于通过 JBoss 包装的连接获取 Oracle 连接,所以我还需要在我的应用程序中配置一些依赖项:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure>
<deployment> 
 <dependencies> 
    <module name="org.jboss.ironjacamar.jdbcadapters" />  
    <module name="com.oracle.ojdbc6" />
 </dependencies>
 <exclusions>
   <module name="org.apache.log4j" />
 </exclusions>
</deployment>

org.jboss.ironjacamar.jdbcadapters 是带有 JBOSS 库的模块,其中包含包装的连接类。

我真的希望这个答案对某人有所帮助。

于 2014-09-08T09:33:24.450 回答