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

Jos*_*hDM 5 java sql-server jboss jdbc active-directory

JBoss作为Active Directory用户运行ABC\appuser.我想以AD用户身份连接到MS SQL Server 8.0数据库ABC\dbuser.使用参数integratedSecurity=true,除非我user=ABC\dbuser;password=dbpass在连接URL上指定,系统将尝试连接为服务AD用户,ABC\appuser.

根据这个问题,我已经确认通过使用以下url,我可以像ABC\dbuser运行应用程序时那样连接到数据库ABC\appuser:

jdbc:sqlserver://MYHOSTNAME:1433;DatabaseName=MyDatabaseName;integratedSecurity=true;user=ABC\dbuser;password=dbpass
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我在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>
Run Code Online (Sandbox Code Playgroud)

我无法使用此警告创建池资源:

WARN  
[org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller) 
IJ000610: Unable to fill pool: 
javax.resource.ResourceException: Could not create connection
Run Code Online (Sandbox Code Playgroud)

对于设定值user-namepasswordXML条目产生类似的故障警告.

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

  1. 扩展JBoss用于创建此数据源的类,将其替换connection-url为按预期应用值的自定义类
  2. 将JBoss改为运行为ABC\dbuser
  3. ABC\appuser通过直接访问或将其添加到具有访问权限的AD组来授予JBoss服务用户数据库访问权限.

这些变通办法都不是优选的; 必须有一个更优雅,被接受的解决方案.我该如何解决这个问题?

Chr*_*her 5

我很惊讶连接字符串正在工作。我的理解是,Microsoft提供的JDBC驱动程序中的IntegratedSecurity属性与等效的.NET连接字符串中的Integrated Security或Trusted Connection属性的工作方式相同。

也就是说,将IntegratedSecurity设置为true会使JDBC驱动程序有效地忽略提供的用户和密码,并尝试以应用程序运行时所用的用户身份登录。

我没有Microsoft SQL Server驱动程序的解决方案,但是可以使用开源jTDS JDBC驱动程序解决此问题。

在大部分情况下,您应该可以换出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>
Run Code Online (Sandbox Code Playgroud)

根据您要连接的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>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将以下XML添加到standalone.xml中(修改drivers元素以添加driver元素(如果已存在))

    <drivers>
      <driver name="jtds" module="net.sourceforge.jtds">
        <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
      </driver>
    </drivers>
    
    Run Code Online (Sandbox Code Playgroud)