Ich verwende JConsole, um auf eine MBean zuzugreifen, die ausgeführt wird.Umgehung der JConsole-Anforderung für Benutzername/Kennwort - bei Verwendung eines benutzerdefinierten Jaas-Anmeldemoduls mit JMX für Autorisierung und Authentifizierung
Die MBean verwenden eine Login-Modul benutzerdefinierte JAAS und wird mit dem folgenden Befehl:
java -classpath UserLGUGroupHandlingApplication.jar;MBeanSecure.jar
-com.sun.management.jmxremote.login.config=management.properties
-Djava.security.auth.login.config=./sample_jaas.config
com.test.running.RunningImplementation
Mit der management.properties Datei wie folgt aussehen:
com.sun.management.jmxremote.access.file=jmxremote.access
com.sun.management.jmxremote=true
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.port=1234
com.sun.management.jmxremote.login.config=Sample
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.ssl.need.client.auth=false
und der sample_jaas.config:
Sample {
test.module.AETTLoginModule required debug=true;
};
und dann wird ein Benutzer auf diese laufenden Prozesse zugreifen, indem er sich anmeldet h JConsole über die Befehlszeile.
jconsole -debug //or just jconsole
Der Benutzer wählt ‚Remote-Verbindung‘ mit RemoteProcess ‚localhost: 1234‘
Die Loginmodule übernimmt die Benutzervalidierung und Einstellung von Principals auf dem Benutzer basiert derzeit in Windows angemeldet, die verwendet wird, Abfrage einer separaten Berechtigungslogik, um die Zugriffsebene zu bestimmen.
Was ich will geschehen:
- Benutzer Kraftspender JConsole in cmd
- Das jconsole Fenster öffnet sich.
- Der Benutzer gibt die Adresse des Prozesses ein, z. "localhost: 1234"
- Benutzer nicht Geben Sie einen Benutzernamen oder ein Kennwort ein (da dies nicht erforderlich ist, da die Autorisierung von einem benutzerdefinierten JAAS-Anmeldemodul gehandhabt wird).
- Das Modul legt fest, ob der Benutzer schreibgeschützt, schreibgeschützt oder nicht zugreifbar ist.
- Das Jconsole-Fenster für den Prozess wird geöffnet, oder die Anmeldung schlägt fehl.
Das Problem:
Um den JMX-Prozess im jconsole Fenster gelange ich muß einen Dummy-Benutzername und das Passwort eingeben, zum Beispiel U: a, P: a, sonst bekomme ich die folgende Fehlermeldung:
java.lang.SecurityException: Authentication failed! Credentials required
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(JMXPluggableAuthenticator.java:193)
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(JMXPluggableAuthenticator.java:145)
at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(ConnectorBootstrap.java:201)
at javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
at javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2327)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:277)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:225)
at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:334)
at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:296)
at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:280)
Frage
Für den JAAS Login-Modul Ich brauche den folgenden Satz zu laufen:
-Dcom.sun.management.jmxremote.authenticate=true
Aber Dadurch wird auch eine Bedingung in JConsole erstellt, in der die Felder Benutzername und Kennwort im Feld geöffnet sein müssen.
Wenn dies auf false gesetzt ist, wird das Login-Modul nie aufgerufen.
Ist es möglich, die JConsole Funktionalität für eine bestimmte Instanz entweder zu erweitern, eine Konfigurationseinstellung, einzeln oder jaas Login-Modul ermöglichen, ohne zu setzen zu benötigen:
-Dcom.sun.management.jmxremote.authenticate=true
Um die Notwendigkeit der Eingabe eines zu verhindern Benutzername und Passwort in den folgenden Bereichen hervorgehoben unten:
ich bin für eine Lösung ähnlich der here demonstriert suchen. Aber ohne dass der Benutzer den Benutzernamen oder das Passwort eingeben muss.
EDIT: Auch, um dies zu klären, müsste dies ohne Änderung der Client-Seite JCONSOLE getan werden, also rein mit serverseitigen Änderungen und Einstellungen.
Danke, aber meine Frage speziell ist die jconsole Notwendigkeit für Benutzer zum Ändern Eingabe auf die Anforderungen. Die Fallstudie konzentriert sich auf das JaasLoginModule und den clientseitigen Code. – Loco234
Bitte con; t Link nur Antworten, da Links können brechen. – NathanOliver
Re: die Bearbeitung. Ich bin neugierig, ob es einen einfacheren Ansatz dazu gibt, da die Verwendung eines Jaas Login-Moduls eine ziemlich häufige Anforderung ist. Es wäre merkwürdig, die Eingabe von Benutzer- und Passwortberechtigungen nur über die Felder in Jconsole zu beschränken. Mein erster Gedanke war, auf eine JAAS-Konfigurationsdatei zu zeigen, während ich com.sun.management.jmxremote.authenticate = false setzte. Die Kontextgenerierung wird von einem separaten Skript ausgeführt, das im Anmeldemodul aufgerufen wird. Dadurch wird die Überprüfung der Benutzeranmeldeinformationen effektiv umgangen, da sie auf dem aktuell angemeldeten Benutzer basieren. – Loco234