2013-05-19 14 views
14

Bene Sto provando a creare l'autenticazione JAAS per il mio servlet (in esecuzione su Tomcat 7 in Eclipse), ma sto ricevendo questo errore.javax.security.auth.login.LoginException: nessun LoginModules configurato per SomeLogin

di He're la completa analisi dello stack: '`

INFO: Starting Servlet Engine: Apache Tomcat/7.0.32 
Geg 19, 2013 9:53:08 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 
Geg 19, 2013 9:53:08 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-bio-8009"] 
Geg 19, 2013 9:53:08 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 1786 ms 
Geg 19, 2013 9:53:30 PM org.apache.catalina.realm.JAASRealm authenticate 
SEVERE: Unexpected error 
javax.security.auth.login.LoginException: No LoginModules configured for GdiaLogin 
    at javax.security.auth.login.LoginContext.init(Unknown Source) 
    at javax.security.auth.login.LoginContext.<init>(Unknown Source) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:392) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:332) 
    at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:158) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Geg 19, 2013 10:29:20 PM org.apache.catalina.realm.JAASRealm authenticate 
SEVERE: Unexpected error 
javax.security.auth.login.LoginException: No LoginModules configured for GdiaLogin 
    at javax.security.auth.login.LoginContext.init(Unknown Source) 
    at javax.security.auth.login.LoginContext.<init>(Unknown Source) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:392) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:332) 
    at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:158) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

`

In context.xml:

<Realm className="org.apache.catalina.realm.JAASRealm" 
appName="GdiaLogin" 
userClassNames="org.ktu.gdia.core.security.UserPrincipal" 
roleClassNames="org.ktu.gdia.core.security.RolePrincipal" /> 

In jaas.config (sono abbastanza sicuro Tomcat lo trova correttamente perché ho aggiunto il percorso corretto con argomenti per "eseguire le configurazioni" in eclissi):

GdiaLogin { 
    org.ktu.gdia.core.security.GdiaLoginModule required debug=true; 
}; 

sto assumendo deve esserci qualcosa che non va con la jaas.config ...

mio accesso modulo, non so se ho bisogno di fornire qui, però, è quasi direttamente da un tutorial che ho' ve stato seguente:

package org.ktu.gdia.core.security; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import javax.security.auth.Subject; 
import javax.security.auth.callback.Callback; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.callback.NameCallback; 
import javax.security.auth.callback.PasswordCallback; 
import javax.security.auth.callback.UnsupportedCallbackException; 
import javax.security.auth.login.LoginException; 
import javax.security.auth.spi.LoginModule; 

import org.ktu.gdia.core.businesslogic.ControllerFactory; 
import org.ktu.gdia.core.interfaces.SecurityControllerInterface; 

public class GdiaLoginModule implements LoginModule { 

    private CallbackHandler handler; 
    private Subject subject; 
    private UserPrincipal userPrincipal; 
    private RolePrincipal rolePrincipal; 
    private String login; 
    private List<String> userGroups; 

    private SecurityControllerInterface securityController; 


    @Override 
    public void initialize(Subject subject, CallbackHandler callbackHandler, 
      Map<String, ?> sharedState, Map<String, ?> options) { 

     try { 

     securityController = ControllerFactory.getInstance().getSecurityController(); 

    } catch (ClassNotFoundException | InstantiationException 
      | IllegalAccessException e) { 

     throw new RuntimeException("Failed to initialize SecurityController in " + this.getClass().getSimpleName(), e); 
    } 
     handler = callbackHandler; 
     this.subject = subject; 
    } 

    @Override 
    public boolean login() throws LoginException { 

    Callback[] callbacks = new Callback[2]; 
    callbacks[0] = new NameCallback("login"); 
    callbacks[1] = new PasswordCallback("password", true); 

    try { 
     handler.handle(callbacks); 
     String name = ((NameCallback) callbacks[0]).getName(); 
     String password = String.valueOf(((PasswordCallback) callbacks[1]) 
      .getPassword()); 

     // Here we validate the credentials against some 
     // authentication/authorization provider. 
     // It can be a Database, an external LDAP, 
     // a Web Service, etc. 
     // For this tutorial we are just checking if 
     // user is "user123" and password is "pass123" 

     if (securityController.credentialsValid(name, password)) { 

      // TODO authenticate 

      login = name; 
      userGroups = new ArrayList<String>(); 
      userGroups.add("admin"); 
      return true; 

     } 

     if (name != null && 
      name.equals("user123") && 
      password != null && 
      password.equals("pass123")) { 

     // We store the username and roles 
     // fetched from the credentials provider 
     // to be used later in commit() method. 
     // For this tutorial we hard coded the 
     // "admin" role 
     login = name; 
     userGroups = new ArrayList<String>(); 
     userGroups.add("admin"); 
     return true; 
     } 

     // If credentials are NOT OK we throw a LoginException 
     throw new LoginException("Authentication failed"); 

    } catch (IOException e) { 
     throw new LoginException(e.getMessage()); 
    } catch (UnsupportedCallbackException e) { 
     throw new LoginException(e.getMessage()); 
    } 

    } 

    @Override 
    public boolean commit() throws LoginException { 

    userPrincipal = new UserPrincipal(login); 
    subject.getPrincipals().add(userPrincipal); 

    if (userGroups != null && userGroups.size() > 0) { 
     for (String groupName : userGroups) { 
     rolePrincipal = new RolePrincipal(groupName); 
     subject.getPrincipals().add(rolePrincipal); 
     } 
    } 

    return true; 
    } 

    @Override 
    public boolean abort() throws LoginException { 
    return false; 
    } 

    @Override 
    public boolean logout() throws LoginException { 
    subject.getPrincipals().remove(userPrincipal); 
    subject.getPrincipals().remove(rolePrincipal); 
    return true; 
    } 

} 

Edit: I miei argomenti esecuzione di configurazione in Eclipse per Tomcat:

-Dcatalina.base="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7" -Dcatalina.home="D:\Servers\GenTreeUploader_Tomcat7" -Dwtp.deploy="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\wtpwebapps" -Djava.endorsed.dirs="D:\Servers\GenTreeUploader_Tomcat7\endorsed" -Djava.security.auth.login.config="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\conf\jaas.config" 

Ebbene? Qualche idea?

+0

Dove hai inserito il file context.xml? Deve essere all'interno della cartella META-INF. – JamesB

+0

@JamesB È nella cartella WebContent/META-INF /, insieme a MANIFEST.MF autogenerato –

risposta

17

Secondo http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#JAASRealm

È necessario impostare un file login.config per Java e dire Tomcat dove trovarlo specificando la sua posizione alla JVM, ad esempio impostando la variabile d'ambiente: JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config=$CATALINA_BASE/conf/jaas.config

Aggiunto

Per Windows aperto startup.bat Aggiungere la seguente riga: set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config dopo okHome

ad es.

:okHome 
set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config 
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" 
+0

Beh, io non sapevo dove e come impostare quella variabile d'ambiente, quindi l'ho appena aggiunto per eseguire le configurazioni, ma lo fa trovo il file jaas.config credo, perché se specifico il percorso sbagliato per il file di configurazione, mi dice che non riesce a trovare il file, in questo momento non si lamenta di non aver trovato il file. Ho pensato che ci fosse qualcosa di sbagliato all'interno del file, ma forse hai ragione su questo. Quindi puoi dirmi come posso impostarlo? È in Windows, le impostazioni di sistema, le impostazioni avanzate e aggiungendo JAVA_OPTS, o come? –

+0

Non capisco come impostarlo, è JAVA_OPTS come una nuova variabile di ambiente e il valore: "-Djava.security.auth.login.config == $ CATALINA_BASE/conf/jaas.config"? Come saprà Tomcat usarlo allora? –

+0

La risposta è aggiornata – Michael

2

Una risposta in ritardo po ', ma nel caso in cui qualcuno sta avendo lo stesso problema consentendo loro moduli personalizzati JAAS all'interno di Eclipse: Devi passare il percorso del file di jaas.config a Tomcat nei suoi argomenti di avvio. Il modo per farlo in Eclipse è:

  1. doppio clic l'istanza di Tomcat sulla scheda server
  2. Fare clic su "Apri configurazione di lancio"
  3. Nei "Argomenti" scheda, c'è un testo VM argomenti di input .
  4. Aggiunge il vostro parametro: -Djava.security.auth.login.config = "", vale a dire:

    -Djava.security.auth.login.config = "D: \ tomcat \ 7.0.50" \ conf \ jaas.config"

  5. fare clic su Applica, OK e riavviare il server
0

Ho avuto esattamente lo stesso problema:.

javax.security.auth.login.LoginException: No LoginModules configured for OwnModule 

ma il percorso del file jaas.config aveva ragione sono sicuro, perché quando ho fatto la sintassi errore nel jaas.config, ho ottenuto eccezione:

java.io.IOException: Configuration Error: 

ho risolto questo da cambiamento codifica file "jaas.config"! Per prima cosa ho creato questo file in UTF-8 e poi ho ricevuto un'eccezione. Quando ho cambiato la codifica in ANSI, è stato eseguito senza problemi! Un po 'pazzo.

1

Se Tomcat 7 è in esecuzione come servizio, non è possibile utilizzare il file .bat (non verranno chiamati).

Tuttavia, è possibile eseguire .EXE Tomcat7w.exe trovato nella directory/bin. Vedrai un pannello con una scheda Java. Puoi aggiungere le proprietà -D (come puntare al tuo file jaas.config) lì.