2014-10-09 12 views
7

Devo supportare più tipi di database per la mia applicazione Web abilitata per tenant. Tra gli altri, ho supportato con successo Microsoft SQL Server, utilizzando la classe net.sourceforge.jtds.jdbc.Driver con una stringa di connessione come "jdbc: jtds: sqlserver: //192.168.1.189: 1433/ApplicationName". Funziona, ma richiede che l'utente definisca esplicitamente un utente nell'istanza di SQL Server e abiliti l'autenticazione di SQL Server.Autenticazione su un'istanza di SQL Server come utente Windows tramite JDBC

Ora, inevitabilmente, i requisiti sono cambiati e dovremmo supportare la connessione a SQL Server tramite l'autenticazione di Windows. Evidentemente ciò richiede una sorta di modifica alla stringa di connessione, poiché il server del data base deve in qualche modo essere in grado di distinguere se le credenziali passate nella connessione del database sono per un utente definito nell'installazione di SQL Server o nel sistema operativo Windows. Ma cos'è?

Operando su consiglio da Internet, se progredito fino all'estensione della stringa di connessione con ;useNTLMv2=true;domain=WORKGROUP. Che sembra per rendere il server di base di dati consapevoli che voglio per autenticare un utente di Windows, ma l'attuale log-in non riesce con

The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000) 

ora Im mio test di set-up, sia l'applicazione J2EE e la Le istanze del server SQL sono infatti sulla stessa macchina (anche se in produzione potrebbero non esserlo), e comunque questo computer non è abbastanza affidabile per accedere a se stesso? Evidentemente mi manca una grande parte del puzzle qui. Che cosa si deve fare per convincere un'istanza di SQL Server che l'utente che l'ha avviato può in effetti collegarsi ad esso tramite JDBC?

Modifica

Dal momento che abbiamo già affondato troppo sforzo infruttuoso tentativo di integrare la nostra applicazione web con uno stack completo di Microsoft infrastrutture (SQL Server, Active Directory, Domain Name Service ...), devo limitare questa domanda:

qualcuno sa un modo per accedere a un server installazione SQL con un account utente definito come un "Windows user" via JDBC modulo di un'applicazione J2EE, senza deve utilizzare Active Directory, una macchina Windows che esegue l'applicazione Web e una DLL proprietaria? La taglia è per qualsiasi soluzione di quel sotto-problema. L'intero problema è chiaramente troppo ampio per essere risolto in un post sul forum.

+1

È questo computer un membro di un dominio Active Directory di Windows? Non so molto del driver jTDS ma hai installato il single sign su DLL? Un'altra opzione è il driver Microsoft JDBC, che supporta l'autenticazione di Windows senza SSO. –

+0

No, tutto quello che abbiamo qui sono alcune finestre di sviluppo standalone di Windows. Un collega sta ora esaminando cosa dovremmo fare per stabilire un ambiente Active Directory per noi stessi. In alternativa, comprendo correttamente che con il driver sqljdbc4.jar potrei andare via senza eseguire un controller di dominio localmente? Se è così, preferirei davvero ottenere la connettività semplicemente adattando l'URL e i parametri di connessione. –

+0

Tenere presente che l'esecuzione di SQL Server su un controller di dominio non è supportata. In genere, si utilizza l'autenticazione di Windows solo con AD già disponibile. Se non lo hai, perché non usare solo l'autenticazione SQL? Perché un requisito impone di utilizzare l'autenticazione di Windows senza l'infrastruttura di supporto? –

risposta

2

Ciò che descrivi sembra certamente fattibile. Ho SQL Server 2008 R2 Express in esecuzione su un server standalone e sono riuscito a connettermi utilizzando un nome utente/password di Windows su quel server tramite jTDS 1.3.1 da una macchina Windows separata e da una casella 14.04 di Xubuntu.

Sulla macchina su cui è in esecuzione SQL Server ho creato un utente Windows denominato "kilian". In SQL Server stesso ho creato un accesso SQL per NT AUTHORITY\Authenticated Users. Quindi nel database (chiamato 'myDb') ho creato un utente denominato 'AuthenticatedUsers' per quel Login SQL. Solo per mantenere le cose semplici ho dato a quell'utente i diritti db_owner sul database.

DatabaseUser.png

Non v'è alcun accesso SQL per 'Kilian' e nessun database utente con quel nome.

Poi, dalle altre due macchine (la workstation di Windows e la scatola Xubuntu) Ho appena eseguito questo:

package com.example.jtdstest; 

import java.sql.*; 

public class JtdsTestMain { 

    public static void main(String[] args) { 
     try (Connection con = DriverManager.getConnection(
       "jdbc:jtds:sqlserver://192.168.1.137:52865/myDb" + 
        ";domain=whatever", 
       "kilian", 
       "4theBounty")) { 
      try (Statement s = con.createStatement()) { 
       String sql = "SELECT LastName FROM Clients WHERE ID=1"; 
       try (ResultSet rs = s.executeQuery(sql)) { 
        rs.next(); 
        System.out.println(rs.getString("LastName")); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 

    } 

} 

Note aggiuntive:

  • non ho dovuto includere useNTLMv2=true. Sono stato in grado di connettermi con o senza quel parametro.

  • ho fatto devono includere domain= a dire lo SQL Server di non utilizzare l'autenticazione di SQL, ma il valore effettivo ho fornito fatto alcuna differenza. (Ho letteralmente usato 'qualunque', che non era il nome del server o il nome del gruppo di lavoro a cui appartiene.)

0

Metodo alternativo

La soluzione alternativa è quella di utilizzare integrato sicurezza. Ciò consente alla tua applicazione di connettersi al database come utente in cui l'applicazione è attualmente in esecuzione come. Ciò è abilitato aggiungendo integratedSecurity=true; nelle proprietà della stringa di connessione. In caso di problemi, assicurarsi che sqljdbc_auth.dll sia accessibile tramite classpath o all'interno della libreria dell'app.

Nota sulla protezione

Siete probabilmente già a conoscenza, ma solo dire assicurarsi di non concedere l'accesso a "utenti autenticati" per il database come suggerito in precedenza, nell'ambito della manifestazione. Identificare quale account utente viene eseguito dall'applicazione e concedere l'accesso solo a quell'utente specifico nel server del database.

Fonti/Ulteriori informazioni

0

Il problema principale è l'autenticazione di Windows con una soluzione di Java completo (senza DLL). Così si potrebbe utilizzare una delle librerie di seguito:

Quindi, una volta che l'app è stata autenticata con una delle librerie precedenti, il tuo JDBC dovrebbe funzionare bene con "integratedSecurity = true;" e se necessario "authenticationScheme = JavaKerberos".

0

In primo luogo si dovrebbe scrivere la connessione JDBC in questo modo:

String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true"; 

poi

you need to enable the SQL Server TCP/IP Protocol in Sql Server Configuration Manager app. You can see the protocol in SQL Server Network Configuration.

0

Vedo due possibilità, 1. Si utilizza un account di sistema locale che il server non capisco In questo caso, passa a un account di dominio.

  1. L'autenticazione di Windows ha requisiti di credenziali diversi e potresti non incontrarli. In questo caso prova a cambiare la password per soddisfare i requisiti.

È molto probabile che entrambi stiano accadendo.

0

vedere quest'altro SO post che descrive come connettersi a uno SQL Server con autenticazione di Windows da una macchina Linux tramite JDBC