如何在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-namepassword XML条目的值会创建类似的故障警告。

我目前的解决方案选项似乎是以下任何一种:

  1. 扩展JBoss用于创建此数据源的任何类,将其替换为按预期应用connection-url值的自定义类或
  2. 将JBoss改为ABC\dbuser
  3. 通过直接访问或将其添加到具有访问权限的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驱动程序的相当繁琐的说明:

  1. 创建文件夹JBOSS_HOME \ modules \ net \ sourceforge \ jtds \ main

  2. 将文件jtds-1.3.1.jar复制到该文件夹​​中。

  3. 在包含以下内容的文件夹中创建名为module.xml的文件

               
  4. 将以下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,但你有(我认为)两种不同的选择。

  1. 不知何故,在JBoss内部将要尝试连接到此数据源时,上下文将从ABC \ AppUser帐户模拟到ABC \ DBUser帐户。 这需要在JBoss内部完成,不幸的是我不相信这是可能的(虽然我不是积极的)。

  2. 将连接和模拟权限(仅限ABC \ DBUser登录)授予SQL Server内的ABC \ AppUser帐户。 使用JBoss数据源配置项new-connect-sql运行impersonation命令,使其成为SQL Server内的ABC \ DBUser(EXECUTE AS LOGIN =’ABC \ DBUser’WITH NO_REVERT)。