2015-03-13 57 views
0

如果以前已經回答過很多次,那麼表示歉意。到目前爲止,我已經看到了很多「不,你不能這樣做」的答案,但他們都已經至少5歲,所以我認爲我會冒險的問題...在jdbc(&hibernate)中設置集成安全性的Windows憑據

我正在寫一個java web(intranet)應用程序,它將連接到MS SQL Server(2012)數據庫。在最初的開發中,我已經與SQL Server安全性以及集成安全性相關聯,並且從db中讀取和寫入,因此我將繼續前進。我們的數據庫由dba團隊維護,我們的.net應用程序設置了特定的Windows憑據,因此只有一個用戶在數據庫上設置。我認爲他們更喜歡這個。我想知道是否可以從Java設置Windows憑據?因此,例如

jdbc.url = jdbc:sqlserver:// servername; database = dbname; integratedSecurity = true;

將連接爲域\ appuser?

我想我可以使用活動目錄組,因此它不是一個重要的問題,但我很好奇!

謝謝

回答

0

是的。您可以將憑據提供給SQL Server JDBC驅動程序。您也可以使用Web客戶端的身份,這是我認爲您真正想問的。這被稱爲「委託」,Kerberos協議支持這一點。

但是,您必須使用Kerberos和服務帳戶(您的Web服務用於參與客戶端的Kerberos身份驗證的帳戶)來驗證Web客戶端必須允許委派。然後,在認證過程中,您必須將委派的憑證存儲在Kebreros憑證緩存中,以便當您嘗試使用SQL Server JDBC驅動程序時,它可以查看它並將其用作連接標識。

但說實話,即使這似乎是一個優雅的方式來做到這一點,你可能不應該使用委派。不適用於HTTP應用程序。在實踐中,Kerberos相當易變。而且我還沒有意識到使用Java中的Kerberos驗證Web客戶端是一個非常好的包。他們在外面。但他們是黑客。內置於Java中的Kerberos實現不太好。例如,Kerberos很大程度上依賴於DNS,但內建的Java Kerberos只使用Java的DNS,它默認爲主DNS,這意味着它的能力非常有限(無法查詢不同的DNS服務器)。另外,如果您使用客戶端標識連接到SQL Server,則您將創建並拆除大量昂貴的數據庫連接。意味着它會很慢。它看起來可能會起作用,但如果你真的把它放在負載下,它會明顯變慢。

所以我說的是,你應該真的只是使用一個身份連接到SQL Server。這是目前「行業最佳實踐」。除非絕對需要,否則不要使用委派。

+0

謝謝。從廣義上講,我會在哪裏提供證書?我是否在代碼中設置了一個虛擬網絡用戶並使用它進行調用?或者它是連接上的一組屬性還是連接字符串(connection.user,.domain,password等)中的一組屬性 – gringogordo 2015-04-08 16:42:24