javax.de sécurité.auth.connexion.LoginException: Pas de LoginModules configuré pour SomeLogin
Eh bien, je suis en train de créer d'authentification JAAS pour ma Servlet (en cours d'exécution sur Tomcat 7 dans Eclipse), mais j'obtiens cette erreur.
Il es de la trace de la pile complète:
"
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)
`
Dans 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" />
Dans jaas.config (je suis sûr que Tomcat trouve correctement parce que j'ai ajouté le chemin d'accès correct avec des arguments pour le "run configurations" dans eclipse):
GdiaLogin {
org.ktu.gdia.core.security.GdiaLoginModule required debug=true;
};
Je suis en supposant qu'il doit être quelque chose de mal avec l'jaas.config...
Mon Module de Connexion, pas sûr si j'ai besoin de les fournir ici, pourtant, c'est presque directement à partir d'un tutoriel que j'ai suivi:
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: Ma configuration d'exécution des arguments dans eclipse pour 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"
Bien? Des idées?
C'est dans le WebContent/META-INF/ dossier, avec générés automatiquement MANIFESTE.MF
OriginalL'auteur Arturas M | 2013-05-19
Vous devez vous connecter pour publier un commentaire.
Selon http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#JAASRealm
Vous devez configurer une connexion.fichier de configuration de Java et de dire Tomcat où le trouver en précisant son emplacement à la JVM, par exemple en définissant la variable d'environnement:
JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config=$CATALINA_BASE/conf/jaas.config
Ajouté
Pour Windows ouvrez
startup.bat
Ajoutez la ligne suivante:
set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config
aprèsokHome
par exemple
Je n'ai pas vraiment comment le définir, est-il JAVA_OPTS comme une nouvelle variable d'environnement et de la valeur: "-Djava.de sécurité.auth.connexion.config==$CATALINA_BASE/conf/jaas.config"? Comment tomcat savoir l'utiliser, alors?
La réponse est à jour
Merci, j'ai mis les variables, mais semble toujours jeter la même exception en quelque sorte. :S
Je voudrais essayer de lancer Tomcat sans Eclipse (et de la modification du fichier de commandes) pour comprendre si le problème en JAAS ou pas.
OriginalL'auteur Michael
Un peu en retard de réponse, mais au cas où quelqu'un est d'avoir le même problème en permettant à leurs JAAS modules personnalisés au sein d'Eclipse: Vous avez à passer à l'emplacement de jaas.fichier de configuration de Tomcat dans ses arguments de démarrage. La façon de le faire dans Eclipse est :
Ajouter votre paramètre: -Djava.de sécurité.auth.connexion.config="", j'.e:
-Djava.de sécurité.auth.connexion.config="D:\tomcat\7.0.50"\conf\jaas.config"
OriginalL'auteur Pantelis
J'ai eu exactement le même problème:
mais le chemin d'accès au fichier jaas.config était de droite. Je suis sûr, parce que quand j'ai fait erreur de syntaxe dans jaas.config, j'ai exception:
J'ai résolu ce problème par modifier le codage fichier "jaas.config"! J'ai d'abord créé ce fichier en UTF-8 et j'ai été mentionnés exception. Quand j'ai changé l'encodage ANSI, il a été en cours d'exécution sans problème! Un peu fou.
OriginalL'auteur Radek
Si vous avez Tomcat 7 en cours d'exécution en tant que service, vous ne pouvez pas utiliser l' .fichier bat (ils ne seront pas appelés).
Cependant, vous pouvez exécuter l' .EXE Tomcat7w.exe trouvé dans le répertoire /bin. Vous verrez un panneau avec un onglet Java. Vous pouvez ajouter -D des propriétés (comme pointant vers votre jaas.fichier de config).
OriginalL'auteur Robert_T_Taylor