Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / "SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0 / 11 сообщений из 11, страница 1 из 1
17.07.2007, 15:27
    #34664490
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Здравствуйте всем!

Обстановка: WAS 6.0 и DB2 8.2 (14 fixpack) установлены на машине с ОС Linux.
Настроил на сервере источник данных. Инсталлировал прогу из ear-файла. В разделе "Security > Global security > J2EE Connector Architecture (J2C) authentication data entries" заведен пользователь, под которым приложение коннектится к базе.
В результате приложение запускается, но при первом же соединении с базой возникает исключение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
[17/7/07 14:50:29:106 MSD] 00000078 WebApp        A   SRVE0181I: [PensTransit] [/PensTransit] [Servlet.LOG]: AuthorizeAppUser: ***Error attempting to find AppUser in AuthoriseAppUser: java.sql.SQLException: Connection authorization failure occurred.  Reason: User ID or password invalid.DSRA0010E: SQL State = null, Error Code = -99,999DSRA0010E: SQL State = null, Error Code = -99,999
	at com.ibm.db2.jcc.b.b.h(b.java:2087)
	at com.ibm.db2.jcc.b.b.c(b.java:1652)
	at com.ibm.db2.jcc.b.hb.r(hb.java:805)
	at com.ibm.db2.jcc.b.hb.k(hb.java:364)
	at com.ibm.db2.jcc.b.hb.c(hb.java:138)
	at com.ibm.db2.jcc.b.b.cc(b.java:1417)
	at com.ibm.db2.jcc.b.b.a(b.java:1342)
	at com.ibm.db2.jcc.b.b.s(b.java:1040)
	at com.ibm.db2.jcc.b.b.b(b.java:746)
	at com.ibm.db2.jcc.b.b.a(b.java:732)
	at com.ibm.db2.jcc.b.b.a(b.java:439)
	at com.ibm.db2.jcc.b.b.<init>(b.java:383)
	at com.ibm.db2.jcc.DB2PooledConnection.<init>(DB2PooledConnection.java:59)
	at com.ibm.db2.jcc.DB2ConnectionPoolDataSource.getPooledConnectionX(DB2ConnectionPoolDataSource.java:147)
	at com.ibm.db2.jcc.DB2ConnectionPoolDataSource.getPooledConnection(DB2ConnectionPoolDataSource.java:123)
	at com.ibm.ws.rsadapter.DSConfigurationHelper$1.run(DSConfigurationHelper.java:1005)
	at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java(Compiled Code))
	at com.ibm.ws.rsadapter.DSConfigurationHelper.getPooledConnection(DSConfigurationHelper.java:1000)
	at com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:1021)
	at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:957)
	at com.ibm.ejs.j2c.poolmanager.FreePool.createManagedConnectionWithMCWrapper(FreePool.java:1551)
	at com.ibm.ejs.j2c.poolmanager.FreePool.createOrWaitForConnection(FreePool.java:1343)
	at com.ibm.ejs.j2c.poolmanager.PoolManager.reserve(PoolManager.java:2037)
	at com.ibm.ejs.j2c.ConnectionManager.allocateMCWrapper(ConnectionManager.java:807)
	at com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:583)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:331)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:509)
	at com.pfrkomi.penstransit.domain.AppUser.getConnection(AppUser.java:318)
	at com.pfrkomi.penstransit.domain.AppUser.findByLogin(AppUser.java:218)
	at com.pfrkomi.penstransit.AuthorizeAppUser.doPost(AuthorizeAppUser.java:36)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1282)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1239)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code))
	at com.pfrkomi.penstransit.CommonFilter.doFilter(CommonFilter.java:30)
	at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:142)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code))
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java(Compiled Code))
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:670)
	at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:80)
	at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1802)
	at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:84)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:469)
	at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:408)
	at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:101)
	at com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:566)
	at com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java(Compiled Code))
	at com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:952)
	at com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1039)
	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))

Подскажите, что забыл настроить?

Спасибо
С уважением, Семен Попов
...
Рейтинг: 0 / 0
17.07.2007, 17:03
    #34664948
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Понятно, что не проходит авторизация пользователя в системе DB2. Действительно, открываю центр управления DB2 и не могу подконнектиться с заданным пользователем. Хотя в пользователях базы данных он прописан.
Чтобы прописать пользователя для базы, сначала добавили его в операционной системе (Linux), а затем скриптом "grant connect on database to user "GUEST"" я прописал его в пользователи БД.
Может что неправильно сделали?
...
Рейтинг: 0 / 0
18.07.2007, 11:38
    #34666441
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
С соединением через центр управления DB2 разобрались. Теперь с помощью клиента администрирования я могу подконнектиться к удаленной базе с пользователем guest. Но приложение выдает то же исключение.
В моем приложении все соединения с базой выполняются под одним пользователем guest. Логин и пароль этого пользователя зашит в application.properties. Если в этом файле я изменю логин и пароль на db2admin, то все работает нормально. Но это нельзя. Поэтому я создал другого пользователя guest, которому дал необходимые привелегии. Но под ним прога не хочет коннектиться к базе. Так что же я мог недонастроить, либо в DB2, либо в WebSphere?
...
Рейтинг: 0 / 0
18.07.2007, 12:19
    #34666610
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Общий порядок по пунктам (для WAS 6.x):
1. В приложении нужно задать ссылку на внешний ресурс (<resource-ref>) типа javax.sql.DataSource.
2. На сервере приложений нужно создать пул соединений с СУБД (это вроде сделано)
3. На сервере приложений нужно завести алиас J2C Authentication Data, где прописать логин и пароль пользователя. (тоже вроде сделано)
4. На сервере приложений во время установки/конфигурирования нужно выполнить привязку (маппинг) ссылки на ресурс (п.1) с реальным пулом(п.2) и указать алиас авторизации (п.3)
...
Рейтинг: 0 / 0
18.07.2007, 12:53
    #34666762
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Евгений ХабаровОбщий порядок по пунктам (для WAS 6.x):
Спасибо за отзыв. Я решил проблему. В силу определнных обстоятельств, связанных с настройками клиента администрирования DB2 и ОС Linux на сервере, у меня возникала эта ошибка.

Но не могу понять почему всегда требуется сделать пункты 2-3 из Вашего сообщения (многие советуют), когда это же приложение было развернуто на моей машине (на стадии разработки), и на сервере не было создано ни пула, ни алиаса. Сейчас тоже, для проверки, я удалил созданный мной алиас J2C Authentication Data, а приложение все равно работает. Не влияет ли здесь на это опция "Enable Global Security", которая у меня отключена?
...
Рейтинг: 0 / 0
18.07.2007, 13:16
    #34666883
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Как идет обращение к СУБД из приложения?
Пул соединений в приложении вообще используется?

Настоятельно рекомендуется соединения с СУБД производить через пул.
В этом случае пулом соединений будет управлять сервер приложений, а самому приложению будет достаточно получить соединение из пула, выполнить одну или несколько транзакций и вернуть соединение в пул. Такой вариант работы расчитан на то, что приложения забирают соединения из пула на короткие интервалы времени.
Ну и еще плюс, что приложение знает только объявленное в приложении имя ресурса.
А имя пользователя, пароль и ссылку на реальный сервер приложений настраивает администратор сервера приложений.
...
Рейтинг: 0 / 0
18.07.2007, 14:31
    #34667266
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Евгений ХабаровКак идет обращение к СУБД из приложения?
Пул соединений в приложении вообще используется?
А без него тоже можно? Вроде используется. В Application Deployment Descriptor добавил JDBC-провайдер - DB2 Universal JDBC Driver Provider, а в нем определил необходимый источник данных.
Евгений ХабаровНастоятельно рекомендуется соединения с СУБД производить через пул.
В этом случае пулом соединений будет управлять сервер приложений, а самому приложению будет достаточно получить соединение из пула, выполнить одну или несколько транзакций и вернуть соединение в пул. Такой вариант работы расчитан на то, что приложения забирают соединения из пула на короткие интервалы времени.
Ну и еще плюс, что приложение знает только объявленное в приложении имя ресурса.
А имя пользователя, пароль и ссылку на реальный сервер приложений настраивает администратор сервера приложений.
Спасибо. Вот администратор-то сервера приложений у нас и не хочет заводить и настраивать пользователей. Поэтому пошли по другому пути. Разграничение доступа происходит на уровне приложения. Есть отдельная таблица в базе, которая хранит пользователей и их привилегии. С пользователями и их доступом уже работает так называемый админитратор приложения.
...
Рейтинг: 0 / 0
18.07.2007, 14:54
    #34667392
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Semen Popov Евгений ХабаровКак идет обращение к СУБД из приложения?
Пул соединений в приложении вообще используется?
А без него тоже можно? Вроде используется. В Application Deployment Descriptor добавил JDBC-провайдер - DB2 Universal JDBC Driver Provider, а в нем определил необходимый источник данных.
Можно многое :) В том числе и DriverManager вызывать, но так делать не нужно. Если все делать в приложении, зачем тогда нужен Application Server? Если обращаетесь к пулу через JNDI Lookup, значит пулом пользуетесь.
Semen Popov
Евгений ХабаровНастоятельно рекомендуется соединения с СУБД производить через пул.
В этом случае пулом соединений будет управлять сервер приложений, а самому приложению будет достаточно получить соединение из пула, выполнить одну или несколько транзакций и вернуть соединение в пул. Такой вариант работы расчитан на то, что приложения забирают соединения из пула на короткие интервалы времени.
Ну и еще плюс, что приложение знает только объявленное в приложении имя ресурса.
А имя пользователя, пароль и ссылку на реальный сервер приложений настраивает администратор сервера приложений.
Спасибо. Вот администратор-то сервера приложений у нас и не хочет заводить и настраивать пользователей. Поэтому пошли по другому пути. Разграничение доступа происходит на уровне приложения. Есть отдельная таблица в базе, которая хранит пользователей и их привилегии. С пользователями и их доступом уже работает так называемый админитратор приложения.
Вообще для аутентификации/авторизации тоже рекомендуется пользоваться средствами сервера приложений. В таком случае реестр пользователей ведется отдельно (для WAS 6.0 это или Local OS или LDAP или Custom), а в приложении декларативно или программно права распределяются в соответствии с ролями. Вообще-то это одна из основ J2EE.
Но при этом к СУБД все приложение обычно обращается от одного имени пользователя, которое прописано в алиасе J2C Authentication Data.
...
Рейтинг: 0 / 0
18.07.2007, 16:19
    #34667822
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Евгений ХабаровЕсли обращаетесь к пулу через JNDI Lookup, значит пулом пользуетесь.
Как я уже говорил, провайдер и источник данных я настраиваю в Application Deployment Descriptor через рукоятки, которые предлагает среда разработки. Хотя, если посмотреть исходный код application.xml, то там ничего про это не увидеть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="UTF-8"?>
<application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
	<display-name>
	PensTransitEAR</display-name>
	<module id="WebModule_1170075404203">
		<web>
			<web-uri>PensTransit.war</web-uri>
			<context-root>PensTransit</context-root>
		</web>
	</module>
</application>
Далее, в Web Deployment Descriptor я добавил ссылку на источник данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
	<resource-ref id="ResourceRef_1170251075578">
		<res-ref-name>jdbc/PENSTRAN</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Application</res-auth>
		<res-sharing-scope>Shareable</res-sharing-scope>
	</resource-ref>
А вот методы классов, которые отвечают за соединение с базой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
	/**
	 * Access a Connection from the Datasource
	 * @return a managed Connection
	 */
	public static Connection getConnection() throws SQLException {
		// get a connection
		DataSource ds = getDataSource();
		return ds.getConnection(ApplicationProperties.getDatasourceUserId(), 
								 ApplicationProperties.getDatasourcePassword());
	}

	/**
	 * Get a DataSource configured for this application and 
	 * suitable for storing domain objects.
	 * 
	 * @return javax.sql.DataSource
	 */
	public static DataSource getDataSource() {
		DataSource ds = null;
		try {
			InitialContext context = new InitialContext();
			ds = (DataSource) context.lookup(ApplicationProperties.getDatasourceJndiName());
		} catch (javax.naming.NamingException ne) {
			MappingException e = new MappingException("NamingException: cannot find DataSource in initialContext");
			ne.printStackTrace();
		}
		return ds;
	}


	/** Close an database connection.
	 * 
	 * @param conn the connection to close.
	 */
	protected static void close(Connection conn) {
		try {
			if (conn != null) conn.close();
		} catch (SQLException e) {
		}
	}
Вот такая примерно реализация.

Евгений ХабаровВообще для аутентификации/авторизации тоже рекомендуется пользоваться средствами сервера приложений.
Да, я слышал, что так правильно. Но на момент разработки я знал только нынешний подход. Я думаю, в скором времени изменю принцип аутентификации/авторизации. Единственное требование от администратора сервера - не заставлять его заниматься пользователями. И я видел приложение, которое прямо из него позволяет заводить пользователей как на сервере Linux, как на сервере WAS, так и DB2. Все делается из программы. Попробую разобраться, как это сделать.
...
Рейтинг: 0 / 0
18.07.2007, 17:20
    #34668060
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Код: plaintext
1.
return ds.getConnection(ApplicationProperties.getDatasourceUserId(), ApplicationProperties.getDatasourcePassword());
Заменить на
Код: plaintext
return ds.getConnection();
Тогда будет использоваться пользователь и пароль, который указан в алиасе.

По поводу аутентификации/авторизации.
Тут логика такая, что сервер приложений не ведет базу пользователей, он ее использует.
Реестр пользователей с точки зрения сервера приложений это отдельный продукт и отдельная система, у которого есть свой администратор(ы).
Если используются полноценные продукты ведения реестра пользователей (напр. IBM Tivoli Access Manager), у них есть свои готовые интерфейсы для управления пользователями.
Если используется реестр пользователей ОС, то и база пользователей ведется средствами ОС.
Максимум что требуется от администратора сервера приложений - это выполнить маппинг ролей на пользователей и/или группы реестра. Кстати, тот же ITAM, насколько я помню, позволяет и роли хранить в рееестре, но чтобы это работало в WAS интегрируется модуль от ITAM.

Кроме того, под J2EE некоторые фреймворки сами умеют вести реестр пользователей, не полагаясь на сервер приложений. Но, тогда получается что не используется часть функций защиты сервера приложений.
...
Рейтинг: 0 / 0
18.07.2007, 18:06
    #34668237
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0
Спасибо за подробные ответы.
Евгений ХабаровКроме того, под J2EE некоторые фреймворки сами умеют вести реестр пользователей, не полагаясь на сервер приложений. Но, тогда получается что не используется часть функций защиты сервера приложений.
В моем случае так и есть. Защиты не существует на уровне самого app-сервера. Но, есть у нас отдел такой - защиты информации называется. Он и открывает/закрывает доступ к серверу от конкретных рабочих станций. У них стоит маршрутизатор перед нашими серверами, который сканирует все запросы, а затем запрещает или разрешает клиенту доступ на тот или иной сервер.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / "SQLException: User ID or password invalid" при доступе к базе в приложении под WAS 6.0 / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]