This is the connection provider i've implemented
Code:
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import oracle.jdbc.OracleConnection;
import org.hibernate.HibernateException;
import org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider;
import org.hibernate.util.NamingHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*/
/**
* Clase que provee conexion via el connection Provider
InyectedDataSourceConnectionProvider
* dicha conexion es proxy de otro usuario, para implementar proxy
authentication de oracle
* Para especificar que se utilice esta clase, hay que hacerlo via la propiedad
* hibernate.connection.provider_class del archivo persistence.xml
* @author Julian de Anquin
*/
public class ProxyAuthenticationConnectionProviderImpl extends
InjectedDataSourceConnectionProvider {
private final Logger log =
LoggerFactory.getLogger(ProxyAuthenticationConnectionProviderImpl.class);
public ProxyAuthenticationConnectionProviderImpl() {
}
@Override
public void setDataSource(DataSource ds) {
super.setDataSource(ds);
}
@Override
public Connection getConnection() throws SQLException {
String nombreDeUsuario = UserThreadLocal.getUser();
if (nombreDeUsuario != null) {
return setUserForConnection(super.getConnection(),
nombreDeUsuario);
} else {
return super.getConnection();
}
}
private Connection setUserForConnection(Connection pConn,
String userName) throws
SQLException {
try {
OracleConnection conn = (OracleConnection)pConn;
Properties prop = new Properties();
prop.setProperty(OracleConnection.PROXY_USER_NAME, userName);
System.out.println("seteando autenticacion para " + userName);
conn.openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop);
return conn;
} catch (SQLException e) {
e.printStackTrace(System.err);
throw e;
}
}
/**
* Verifica que la conexion sea una session proxy, en caso
afirmativo la cierra dicha session.
* @param pConn
*/
private void closeProxyConnection(Connection pConn) {
try {
OracleConnection conn = (OracleConnection)pConn;
if (conn.isProxySession()) {
conn.close(OracleConnection.PROXY_SESSION);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Cierra una conexion primero llamando al metodo closeProxyConnection,
* luego al de la clase padre
* @param conn
* @throws SQLException
*/
@Override
public void closeConnection(Connection conn) throws SQLException {
this.closeProxyConnection(conn);
super.closeConnection(conn);
}
}