JBoss作为Active Directory用户ABC\appuser
运行。我想以AD用户ABC\dbuser
连接到MS SQL Server 8.0数据库。使用参数integratedSecurity=true
,除非我在连接网址上指定user=ABC\dbuser;password=dbpass
,否则系统将尝试以服务AD用户ABC\appuser
进行连接。
根据this question,我已确认通过使用以下网址,我可以ABC\dbuser
运行应用程序时以ABC\appuser
身份连接到数据库:
jdbc:sqlserver://MYHOSTNAME:1433;DatabaseName=MyDatabaseName;integratedSecurity=true;user=ABC\dbuser;password=dbpass
不幸的是,当我在JBoss配置xml(JBoss\jboss-eap-6.1.0\standalone\configuration\standalone.xml
)中设置数据源的url时,如下所示:
<datasource jndi-name="java:jboss/datasources/MyDatabaseName" pool-name="MyPoolName" enabled="true" use-java-context="true">
<connection-url>jdbc:sqlserver://MYHOSTNAME:1433;DatabaseName=MyDatabaseName;integratedSecurity=true;user=ABC\dbuser;password=dbpass</connection-url>
<driver>sqlserver</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>10</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name></user-name>
<password></password>
</security>
</datasource>
我无法使用此警告创建池资源:
WARN
[org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller)
IJ000610: Unable to fill pool:
javax.resource.ResourceException: Could not create connection
设置user-name
和password
XML条目的值会产生类似的失败警告。
我目前的解决方案选项似乎是以下任何一种:
connection-url
值的自定义类或ABC\dbuser
或ABC\appuser
数据库访问。这些变通办法都不是优选的;必须有一个更优雅,被接受的解决方案。我该如何解决这个问题?
答案 0 :(得分:4)
我很惊讶连接字符串正在工作。我的理解是,Microsoft提供的JDBC驱动程序中的integratedSecurity属性与等效.NET连接字符串中的Integrated Security或Trusted Connection属性的工作方式相同。
也就是说,将integratedSecurity设置为true会使JDBC驱动程序有效地忽略所提供的用户和密码,并尝试以应用程序运行的用户身份登录。
我没有使用Microsoft SQL Server驱动程序的解决方案,但可以使用开源jTDS JDBC Driver解决此问题。
对于大部分,您应该能够交换JDBC驱动程序JAR文件并调整连接XML,如下所示:
<datasource jndi-name="java:jboss/datasources/MyDatabaseName" pool-name="MyPoolName" enabled="true" use-java-context="true">
<connection-url>jdbc:jtds:sqlserver://MYHOSTNAME:1433/MyDatabaseName;domain=ABC</connection-url>
<driver>jtds</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>10</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>dbuser</user-name>
<password>dbpass</password>
</security>
</datasource>
根据您要连接的SQL Server的配置,您可能还需要将useNTLMv2=true
添加到连接URL。
即。整个连接URL将是:
jdbc:jtds:sqlserver://MYHOSTNAME:1433/MyDatabaseName;domain=ABC;useNTLMv2=true
编辑:不幸的是,在JBoss EAP版本中,你的目标是添加一个新的JDBC驱动程序并不像在正确的地方放下jar那么容易。
以下是添加新JDBC驱动程序的相当繁琐的说明:
创建文件夹JBOSS_HOME \ modules \ net \ sourceforge \ jtds \ main
将文件jtds-1.3.1.jar复制到文件夹中。
在包含以下内容的文件夹中创建名为module.xml的文件
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="net.sourceforge.jtds">
<resources>
<resource-root path="jtds-1.3.1.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
将以下XML添加到standalone.xml(修改drivers元素以添加驱动元素(如果已存在))
<drivers>
<driver name="jtds" module="net.sourceforge.jtds">
<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
</driver>
</drivers>
答案 1 :(得分:0)
首先,我甚至不确定您使用的连接字符串是如何工作的。如果指定了可信连接和用户/通过组合,则应返回错误,因为无法使用这两者。您要么使用当前帐户上下文或特定用户名/密码组合进行连接,而不是两者。即便如此,SQL Server也不会存储AD密码,也不会将用户/密码组合验证为除SQL Server登录之外的任何其他内容。
其次,我不确定你的意思是SQL Server 8.0 RC @,因为RC2意味着发布版本8.0的候选版本2是SQL Server 2000.如果是这样,那根本就不支持,我建议迁移到2012或2014年。
现在,我并不完全精通JBoss,但你有(我认为)两种不同的选择。
不知何故,在JBoss内部尝试连接到此数据源时,上下文将从ABC \ AppUser帐户模拟到ABC \ DBUser帐户。这需要在JBoss内部完成,不幸的是我不相信这是可能的(虽然我不是肯定的)。
将连接和模拟权限(仅限ABC \ DBUser登录)授予SQL Server内的ABC \ AppUser帐户。使用JBoss数据源配置项new-connect-sql运行impersonation命令,使其成为SQL Server内的ABC \ DBUser(EXECUTE AS LOGIN ='ABC \ DBUser'WITH NO_REVERT)。