Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JBoss中配置SQL Server数据源以使用特定的Active Directory用户进行连接?_Java_Sql Server_Jdbc_Jboss_Active Directory - Fatal编程技术网

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

Java 如何在JBoss中配置SQL Server数据源以使用特定的Active Directory用户进行连接?,java,sql-server,jdbc,jboss,active-directory,Java,Sql Server,Jdbc,Jboss,Active Directory,JBoss以Active Directory用户身份运行ABC\appuser。我想以AD用户身份连接到MS SQL Server 8.0数据库ABC\dbuser。使用参数integratedSecurity=true,除非我指定user=ABC\dbuser;password=dbpass在连接url上,系统将尝试以服务广告用户身份进行连接,ABC\appuser 根据,我已确认,当以ABC\appuser的身份运行应用程序时,通过使用以下url,我可以以ABC\dbuser的身份连接到数据

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

根据,我已确认,当以
ABC\appuser
的身份运行应用程序时,通过使用以下url,我可以以
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时,如下所示:

<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>
设置
用户名
密码
XML条目的值会创建类似的故障警告

我当前的解决方案似乎是:

  • 扩展JBoss用于创建此数据源的任何类,将其替换为按预期应用
    连接url
    值的自定义类,或者
  • 将JBoss更改为以
    ABC\dbuser
    身份运行,或
  • 通过授予JBoss服务用户直接访问权限或将其添加到具有访问权限的AD组,授予其数据库访问权限

  • 这些变通办法都不是可取的;必须有一个更优雅、更被接受的解决方案。如何解决此问题?

    首先,我甚至不确定您使用的连接字符串是如何工作的。如果指定受信任连接和用户/过程组合,则应返回一个错误,因为无法同时使用这两个组合。您可以使用当前帐户上下文或特定的用户名/密码组合进行连接,而不是同时使用两者。即便如此,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内部完成,不幸的是,我不相信这是可能的(尽管我不确定)

  • 为SQL Server内部的ABC\AppUser帐户授予连接和模拟权限(仅用于ABC\DBUser登录)。使用JBoss数据源配置项new connect sql来运行模拟命令,使其成为sql Server内部的ABC\DBUser(以LOGIN='ABC\DBUser'的身份执行,不返回)


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

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

    我没有Microsoft SQL Server驱动程序的解决方案,但这个问题可以使用开源解决

    在很大程度上,您应该能够交换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>
    
  • 将以下XML添加到standalone.XML(修改drivers元素以添加driver元素(如果它已经存在)

    
    net.sourceforge.jtds.jdbc.Driver
    

  • 这是可行的,但我们最终还是选择了(我喜欢的)“变通”路线,将服务运行时的广告用户“appuser”添加到一个可以访问SQL Server数据库的广告组中。这很好,因为服务广告用户“appuser”是DB广告用户“dbuser”的唯一消费者。
    <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>
    
    <?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>
    
    <drivers>
      <driver name="jtds" module="net.sourceforge.jtds">
        <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
      </driver>
    </drivers>