[英]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.