如何在JBoss中配置SQL Server数据源以使用特定的Active Directory用户进行连接?
JBoss作为Active Directory用户ABC\appuser
。 我想以AD用户ABC\dbuser
连接到MS SQL Server 8.0数据库。 使用参数integratedSecurity=true
,除非我在连接URL上指定user=ABC\dbuser;password=dbpass
,否则系统将尝试连接为服务AD用户ABC\appuser
。
根据这个问题 ,我已经确认通过使用以下url,当以ABC\appuser
运行应用程序时,我可以作为ABC\dbuser
连接到数据库:
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时,如下所示:
jdbc:sqlserver://MYHOSTNAME:1433;DatabaseName=MyDatabaseName;integratedSecurity=true;user=ABC\dbuser;password=dbpass sqlserver 1 10 true
我无法使用此警告创建池资源:
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条目的值会创建类似的故障警告。
我目前的解决方案选项似乎是以下任何一种:
- 扩展JBoss用于创建此数据源的任何类,将其替换为按预期应用
connection-url
值的自定义类或 - 将JBoss改为
ABC\dbuser
或 - 通过直接访问或将其添加到具有访问权限的AD组,为JBoss服务用户
ABC\appuser
数据库访问提供访问权限。
这些变通办法都不是优选的; 必须有一个更优雅,被接受的解决方案。 我该如何解决这个问题?
我很惊讶连接字符串正在工作。 我的理解是,Microsoft提供的JDBC驱动程序中的integratedSecurity属性与等效.NET连接字符串中的Integrated Security或Trusted Connection属性的工作方式相同。
也就是说,将integratedSecurity设置为true会使JDBC驱动程序有效地忽略所提供的用户和密码,并尝试以应用程序运行的用户身份登录。
我没有Microsoft SQL Server驱动程序的解决方案,但可以使用开源jTDS JDBC驱动程序解决此问题。
对于大部分,您应该能够交换JDBC驱动程序JAR文件并调整连接XML,如下所示:
jdbc:jtds:sqlserver://MYHOSTNAME:1433/MyDatabaseName;domain=ABC jtds 1 10 true dbuser dbpass
根据要连接的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添加到standalone.xml(修改drivers元素以添加驱动元素(如果已存在))
net.sourceforge.jtds.jdbc.Driver
首先,我甚至不确定你使用的连接字符串是如何工作的。 如果指定了可信连接和用户/通过组合,则应返回错误,因为无法使用这两者。 您要么使用当前帐户上下文或特定用户名/密码组合进行连接,而不是两者。 即便如此,SQL Server也不存储AD密码,也不会将用户/传递组合validation为除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)。