簡體   English   中英

JBoss和Oracle代理身份驗證

[英]JBoss and Oracle Proxy Authentication

我想在我的Web應用程序中使用“ Oracle代理身份驗證” 我正在使用JPA框架作為JPA提供程序來實現持久性和eclipselink。

我正在使用的代碼是

        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。

我已經嘗試了Olaf Heimburger的文章中介紹的內容: 通過JPA使用Oracle代理身份驗證(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庫的模塊,其中包含包裝的連接類。

我真的希望這個答案可以幫助到別人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM