簡體   English   中英

如何在JBoss中配置SQL Server數據源以使用特定的Active Directory用戶進行連接?

[英]How do I configure a SQL Server datasource in JBoss to connect using a specific Active Directory user?

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時,如下所示:

<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. 通過授予JBoss服務用戶ABC\\appuser數據庫直接訪問權限或將其添加到具有訪問權限的AD組來授予其訪問權限。

這些解決方法都不是可取的。 必須有一個更加優雅,可以接受的解決方案。 我該如何解決?

我很驚訝連接字符串正在工作。 我的理解是,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>

根據您要連接的SQL Server的配置,您可能還需要向連接URL添加useNTLMv2=true

即整個連接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元素以添加driver元素(如果已存在))

     <drivers> <driver name="jtds" module="net.sourceforge.jtds"> <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class> </driver> </drivers> 

首先,我什至不確定您使用的連接字符串如何工作。 如果指定可信連接和用戶/密碼組合,則應返回錯誤,因為無法同時使用兩者。 您或者要使用當前帳戶上下文或特定的用戶名/密碼組合(而不是兩者)進行連接。 即使這樣,SQL Server也不存儲AD密碼,也不會像除SQL Server登錄名一樣對用戶/密碼組合進行身份驗證。

其次,我不確定您是真的表示SQL Server 8.0 RC @,因為RC2意味着版本8.0的候選發布者2,即SQL Server2000。如果是這樣,則完全不支持,建議您遷移到2012或2014。

現在,我並不完全精通JBoss,但您有兩種選擇(如我所見)。

  1. 不知何故,當要嘗試與此數據源建立連接時,在JBoss內部,將上下文從ABC \\ AppUser帳戶模擬為ABC \\ DBUser帳戶。 這需要在JBoss內部完成,但是不幸的是,我不相信這是可能的(盡管我不是很肯定)。

  2. 將連接和模擬權限(僅用於ABC \\ DBUser登錄)授予SQL Server內部的ABC \\ AppUser帳戶。 使用JBoss數據源配置項new-connect-sql運行模擬命令,使其成為SQL Server內部的ABC \\ DBUser(EXECUTE AS LOGIN ='ABC \\ DBUser'WITH NO_REVERT)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM