Я создаю веб-приложение для системы управления сотрудниками, используя: Apache Tomcat в качестве HTTP-сервера, Oracle в качестве базы данных, апплеты для программирования на стороне клиента и сервлеты для программирования на стороне сервера. Я также хочу использовать DBCP для управления соединениями с базой данных.
Я хотел бы, чтобы сервлет выполнял запросы, чтобы использовать имя пользователя и пароль, введенные клиентом для подключения. Но до сих пор я видел, что имя пользователя и пароль для пула соединений должны быть установлены при настройке ресурса в context.xml
.
Есть ли способ достичь этого и по-прежнему использовать DBCP? Или мне придется открывать соединения в doGet()
и doPost()
для каждого запроса?
Как уже упоминалось в комментариях, логика ограничения выполняется на стороне приложения, а не на стороне базы данных.
Но если вы действительно хотите использовать модель безопасности БД, вам нужно создать отдельный DataSource (ConnectionPool) для каждого зарегистрированного пользователя и сохранить его в своем сеансе. Если у вас много одновременного доступа, вы скоро обнаружите, что у вас заканчиваются ресурсы.
Например, я использую DataSource, поскольку его проще настроить, но вы можете просто использовать любую реализацию пула соединений.
В действии входа вы создаете новый DataSource (например, используя apache common: http://commons.apache.org/proper/commons-dbcp/), и вы вставляете в сеанс
BasicDataSource ds = new BasicDataSource();
...
ds.setPassword(userPassword);
ds.setUserName(login);
...
HttpSession session = request.getSession();
session.setAttribute("DBcon",ds);
и в ваших других получает/сообщения:
HttpSession session = request.getSession();
DataSource ds = (DataSource)session.getAttribute("DBcon");
Поскольку он будет одним источником данных для каждого пользователя, убедитесь, что вы используете некоторые низкие параметры пула, например size = 3, так как этого должно быть достаточно для пользователя.
DataSource::getConnection(String username, String password)
Интерфейс DataSource
имеет метод, специально предназначенный для вашей цели: изменение имени и пароля для каждого соединения при использовании всех других ранее установленных параметров для подключения: DataSource::getConnection(String username, String password)
Интерфейс java.sql.ConnectionPoolDataSource
содержит такой же метод getPooledConnection(String user, String password)
. Так что ваша конкретная реализация пула соединений может поддерживать это.
public javax.sql.DataSource obtainDataSource() {
org.postgresql.ds.PGSimpleDataSource dataSource = new PGSimpleDataSource() ;
dataSource("AcmeInvoices database data source") ;
source.setServerName( "localhost" ) ;
source.setDatabaseName( "invoicing" ) ;
// source.setUser( "Scott" ) ;
// source.setPassword( "tiger" ) ;
return dataSource ; // Returning a reference to the object of this concrete class 'PGSimpleDataSource' as an object of the interface 'DataSource'.
}
При выполнении какой-либо работы с базой данных:
Connection conn = myDataSource.getConnection( "Scott" , "tiger" ) ;
… run SQL
conn.close() ; // Or better yet: Use try-with-resources syntax to automatically close the connection.
Для получения дополнительной информации см. Ответ на мой связанный вопрос.
Смотрите Oracle Tutorial on DataSource
.