2013-05-19 13 views
14

Próbuję utworzyć uwierzytelnianie JAAS dla mojego Servlet (działającego na Tomcat 7 w Eclipse), ale dostaję ten błąd.javax.security.auth.login.LoginException: Brak modułów logowania skonfigurowanych dla SomeLogin

He're za kompletny ślad stosu: „`

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) 

`

W 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" /> 

W jaas.config (jestem całkiem pewny, Tomcat znajduje go poprawnie, ponieważ dodałem poprawną ścieżkę z argumentami "konfiguracja uruchamiania" w środowisku zaćmienia):

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

Ja zakładając, że musi być coś nie tak z jaas.config ...

mój login Moduł, nie wiem, czy muszę dostarczyć go tutaj, choć to prawie prosto z samouczka I” Wcześniej był następujący:

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: Mój bieg argumenty konfiguracyjnych w Eclipse na 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" 

również? Jakieś pomysły?

+0

Gdzie umieściłeś plik context.xml? Musi znajdować się w folderze META-INF. – JamesB

+0

@JamesB Znajduje się w folderze WebContent/META-INF /, wraz z wygenerowanym automatycznie MANIFEST.MF –

Odpowiedz

17

Według http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#JAASRealm

należy skonfigurować plik login.config Java Tomcat i powiedz, gdzie go znaleźć, określając jego lokalizację do JVM, na przykład poprzez ustawienie zmiennej środowiskowej: JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config=$CATALINA_BASE/conf/jaas.config

Dodany

przez otwarte okna startup.bat dodać następujący wiersz: set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config po okHome

np.

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

Nie wiedziałem, gdzie i jak ustawić tę zmienną środowiskową, więc dodałem ją do uruchamiania konfiguracji, ale robi to znajduję plik jaas.config, który wierzę, ponieważ jeśli podam błędną ścieżkę do pliku konfiguracyjnego, mówi mi, że nie może znaleźć pliku, teraz nie narzeka na nie odnalezienie pliku. Pomyślałem, że coś jest nie tak z wewnętrzną częścią pliku, ale może masz rację co do tego. Więc możesz mi powiedzieć, jak mogę to ustawić? Czy to w systemie Windows, ustawieniach systemowych, ustawieniach zaawansowanych i dodawaniu JAVA_OPTS, czy w jaki sposób? –

+0

Naprawdę nie wiem jak to ustawić, czy to JAVA_OPTS jako nowa zmienna środowiskowa i wartość: "-Djava.security.auth.login.config == $ CATALINA_BASE/conf/jaas.config"? Jak Tomcat będzie wiedział, jak go użyć? –

+0

Odpowiedź jest aktualizowana – Michael

2

Trochę późno, ale odpowiedź w przypadku ktoś ma ten sam problem, umożliwiając ich moduły niestandardowe JAAS ciągu Eclipse: Musisz przejść lokalizację pliku jaas.config Tomcat w swoich argumentów startowych. Sposób, w jaki to zrobić w Eclipse jest:

  1. Kliknij dwukrotnie wystąpienie Tomcat na karcie Serwery
  2. Kliknij „Otwórz konfigurację launch”
  3. W „Argumenty” kartę, znajduje się tekst VM wejście argumenty .
  4. Dołącz swój parametr: -Djava.security.auth.login.config = "", a mianowicie:

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

  5. Kliknij Zastosuj, OK i restart serwera
0

miałem dokładnie ten sam problem.

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

ale ścieżka do pliku jaas.config rację jestem pewien, bo gdy zrobiłem błąd składni w jaas.config, mam wyjątek:

java.io.IOException: Configuration Error: 

Rozwiązałem to przez zmiany kodowania plik "jaas.config"! Najpierw utworzyłem ten plik w UTF-8, a następnie wspomniałem o wyjątku. Kiedy zmieniłem kodowanie na ANSI, działało bez problemu! Trochę szalony.

1

Jeśli masz Tomcat 7 działający jako usługa, nie możesz użyć pliku .bat (nie będą one wywoływane).

Można jednak uruchomić .EXE Tomcat7w.exe znaleziony w katalogu/bin. Zobaczysz panel z kartą Java. Możesz dodać właściwości -D (takie jak wskazywanie na plik jaas.config).

Powiązane problemy