如何在JBoss中配置SQL Server数据源以使用特定的Active Directory用户进行连接?

时间:2014-07-11 19:03:14

标签: java sql-server jdbc jboss active-directory

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-namepassword XML条目的值会产生类似的失败警告。

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

  1. 扩展JBoss用于创建此数据源的任何类,将其替换为按预期应用connection-url值的自定义类或
  2. 将JBoss更改为ABC\dbuser
  3. 通过直接访问或将其添加到具有访问权限的AD组来为JBoss服务用户ABC\appuser数据库访问。
  4. 这些变通办法都不是优选的;必须有一个更优雅,被接受的解决方案。我该如何解决这个问题?

2 个答案:

答案 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驱动程序的相当繁琐的说明:

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

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

  3. 在包含以下内容的文件夹中创建名为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>
    
  4. 将以下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,但你有(我认为)两种不同的选择。

  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)。