2015-08-09 23 views
9

Secondo Apache Tomcat 1.7 documentazione:Apache Tomcat 1.7 Come passare parametri aggiuntivi per JAAS

scrivere classi LoginModule, utenti e ruoli sulla base di JAAS (vedi JAAS Authentication Tutorial e Developer JAAS Accesso modulo di Guida) per essere gestito dal contesto di accesso JAAS (javax.security.auth.login.LoginContext) Durante lo sviluppo di LoginModule, si noti che CallbackHandler incorporato di JAASRealm riconosce solo il NameCallback e il PasswordCallback al momento.

Supporta solo NameCallback e PasswordCallback. Voglio passare parametri aggiuntivi al modulo di login JAAS ma non a causa di questa restrizione.

Come passare parametri aggiuntivi al modulo di accesso JAAS?

+0

Le si definiscono nel file jaas.config insieme ai moduli di accesso e li recuperano durante l'inizializzazione. – EJP

+0

@EJP Sto usando il default tomcat org.apache.catalina.realm.JAASRealm che ho definito nel context.xml. Per impostazione predefinita, JAASRealm chiama il proprio gestore di callback. Anche se ho definito un gestore di callback personalizzato, questo non verrà chiamato da JAASRealm. Come posso forzare questo JAASRealm definito nel mio context.xml per usare questo gestore di callback personalizzato? – yapkm01

+0

Tomcat 1.7, sicuro? O piuttosto Tomcat 7, come indicato dai tag che hai usato? –

risposta

1

Scrivi il tuo CallbackHandler. Per dettagli, vedere http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html

Ad esempio, un MyCallbackHandler potrebbe sostenere un ulteriore TextOutputCallback

public void handle(Callback[] callbacks) 
    throws IOException, UnsupportedCallbackException { 

    for (int i = 0; i < callbacks.length; i++) { 
    if (callbacks[i] instanceof TextOutputCallback) { 

     // display a message according to a specified type 
     . . . 

    } else if (callbacks[i] instanceof NameCallback) { 

     // prompt the user for a username 
     . . . 

    } else if (callbacks[i] instanceof PasswordCallback) { 

     // prompt the user for a password 
     . . . 

    } else { 
     throw new UnsupportedCallbackException 
     (callbacks[i], "Unrecognized Callback"); 
    } 
    } 
} 
+0

Ho fatto esattamente questo, ma il default org.apache.catalina.realm.JAASRealm definito nel contesto.xml non lo chiama. Chiama altri gestori di callback. Come posso forzare questo JAASRealm a chiamare il mio gestore di richiamata personalizzato? – yapkm01

+0

Guardando il codice sorgente org.apache.catalina.realm.JAASRealm, vedo che usa sempre ** new JAASCallbackHandler() ** per passare il gestore di callback. Sto iniziando a pensare che non sia possibile impostarne uno personalizzato con JAAS di Tomcat. Nelle applicazioni autonome, devi creare un LoginContext con il gestore: loginContext = new LoginContext ("Sample", new MyCallbackHandler()); –

+0

Quindi qual è la soluzione qui? – yapkm01

-4

modo più semplice: concat tutti i parametri per una stringa, e dividerlo in seguito

+0

Sì. Ci ho pensato anche se non è davvero una buona idea. Non vedo altre soluzioni. Sorprendi quindi che un problema così semplice non possa essere risolto da Tomcat. – yapkm01

1

Il modo convenzionale per approccio questo per mappare i gruppi contractor e customer per i ruoli .

  • Scarica una copia del Servlet 3.0 Specification (Tomcat 7.0 è un'implementazione di questo) e leggere il capitolo sulla sicurezza per vedere la moltitudine di opzioni che sono fornite dal servlet container per autenticazione utenti in base al nome utente e la password e quindi autorizzando gli utenti in base al loro ruolo .
  • Seguire le istruzioni nella documentazione Tomcat per la configurazione di JNDIRealm. Questo fornisce un modo di configurare Tomcat per utilizzare un server LDAP per l'autenticazione (nome utente/password) e l'autorizzazione (controllo dei ruoli).

Utilizzando l'approccio basato sulla specifica come questo ha il vantaggio di garantire la soluzione è portatile se dovessi decidere di migrare verso una soluzione in piena regola Java EE (come JBossAS/wildfly, Glassfish, WebSphere, ecc) nella futuro.

Inoltre, se è possibile migrare a Tomcat 8, si avrà accesso alle funzionalità di autenticazione aggiuntive che sono state aggiunte nella specifica Servlet 3.1.

+0

Cosa succede se un utente ha più ruoli? Nella schermata di accesso usando solo nome utente/password quale ruolo sarebbe quella persona quando accede? Tenere presente che diversi ruoli potrebbero presentare un accesso di autorizzazione diverso a pagine diverse – yapkm01

+0

Questa soluzione consente più ruoli. Spetta a te come viene gestito. Cosa dovrebbe * accadere * se un utente è sia un 'imprenditore' che un 'cliente'? –

+0

Yeap. Supponiamo che l'utente abc sia l'appaltatore e il cliente.Ogni ruolo ha i propri privilegi di accesso a determinati schermi. Al login login abc basta usare il suo id e password. Quali ruoli dovrebbe conoscere il server? Non c'è verso che il lato server possa saperlo. Soluzione è necessaria una schermata di accesso con un altro campo che informa l'utente del server abc ora sta effettuando l'accesso come appaltatore (ad esempio). Il server sa quindi di assegnare il ruolo di appaltatore ad abc e dargli accesso agli schermi relativi all'appaltatore (non ai clienti). Vedi l'immagine ora? – yapkm01