Удаленное подключение к JMX от клиента с помощью пользовательского JMXAuthenticator Программно на Java

#java #authentication #jmx #mbeans

Вопрос:

Я новичок в JMX. Я хочу подключиться к JMX Mbeans с помощью URL-адреса службы (с помощью клиента), но хочу аутентифицировать пользователя перед подключением.

Для этого я написал пользовательский класс аутентификации JMX, т. е. JaasCustomAuthenticator.java. Класс такой, как уже упоминалось:

 public class JaasCustomAuthenticator implements JMXAuthenticator { // public JaasCustomAuthenticator(String s, boolean b) { // }   @Override  public Subject authenticate(Object credentials) {  System.out.println("inside authenticaeee");  System.setProperty("java.security.auth.login.config", "jaasproj01.config");  Maplt;String, Objectgt; myCredentials = new HashMaplt;String, Objectgt;();  if (credentials instanceof String[]) {  // JConsole sends the credentials as string array  // credentials[0] is the username  // credentials[1] is the password  String[] args = (String[]) credentials;   if (args.length == 2) {   //myCredentials.put(USERNAME, args[0]);  myCredentials.put("username", args[0]);   char[] pw = null;   if (args[1] != null) {  pw = args[1].toCharArray();  }   //myCredentials.put(PASSWORD, pw);  myCredentials.put("password", pw);  } else {  throw new SecurityException();  }  } else if (credentials instanceof Map) {  myCredentials.putAll((Map) credentials);  } else {  throw new SecurityException();  }   LoginContext lc = null;   try {  lc = new LoginContext("ZaJaasExample01", new ZaCallbackHandler(myCredentials));  System.out.println("JAAS authenticator called ...");  } catch (LoginException le) {  le.printStackTrace();  }   try {  lc.login(); // try { // Subject.doAsPrivileged(lc.getSubject(), new PrintCodeBaseAndPrincipalsAction(), null); // } catch (PrivilegedActionException ex) { // if (ex.getException() instanceof SecurityException) { // throw (SecurityException) ex.getException(); // } else { // throw new SecurityException(ex.getException()); // } // }   return lc.getSubject();   } catch (LoginException ex) {  throw new SecurityException(ex);  } catch (SecurityException ex) {  throw ex;  } catch (Throwable ex) {  throw new SecurityException(ex);  }  } }  

Мой клиент, с которого я хочу подключиться к удаленному jmx, находится SystemConfigClient.java :

 public class SystemConfigClient {  public static final String HOST = "localhost";  public static final String PORT = "1234";  public static void main(String[] args) throws IOException, MalformedObjectNameException, LoginException {    Maplt;String, String[]gt; env = new HashMaplt;gt;();  String[] credentials = {"user1", "MYP@SSWORD"};  env.put(JMXConnector.CREDENTIALS, credentials);   JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"   HOST   ":"   PORT   "/jmxrmi");  JMXConnector jmxConnector = JMXConnectorFactory.connect(url,env);   MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();  ObjectName name = new ObjectName("com.eq.jmxdemo:type=SystemConfig");   SystemConfigMBean mBeanProxy = MBeanServerInvocationHandler.newProxyInstance(mBeanServerConnection,  name,SystemConfigMBean.class,true);  System.out.println("Current system config : "   mBeanProxy.doConfig());  mBeanProxy.setSchemaName("NewSchemaa");  mBeanProxy.setThreadCount(5);  System.out.println("Neww system config : "   mBeanProxy.doConfig());  mBeanProxy.setThreadCount(0);  jmxConnector.close();  } }  

And the JMX I am trying to connect i.e. SystemConfigManagement.java is:

 public class SystemConfigManagement {  private static final int DEFAULT_THREAD_NUMBER = 10;  private static final String DEFAULT_DB_NAME = "default";  static String[] strArray = {"user1","pass1"};  public static void main(String[] args) throws MalformedObjectNameException,InterruptedException, InstanceAlreadyExistsException,  MBeanRegistrationException, NotCompliantMBeanException {  MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();  SystemConfig mBean = new SystemConfig(DEFAULT_THREAD_NUMBER,DEFAULT_DB_NAME);  ObjectName name = new ObjectName("com.eq.jmxdemo:type=SystemConfig");  JaasCustomAuthenticator j = new JaasCustomAuthenticator();  System.out.println("Authnticator: " j.authenticate(strArray).getPrincipals());   mbs.registerMBean(mBean,name);  do {  Thread.sleep(3000);  System.out.println("[Inside do-while] Thread count= "   mBean.getThreadCount()  " :::: Schema Name: "   mBean.getSchemaName());  }while(mBean.getThreadCount()!=0);  } }  

Прямо сейчас в SystemConfigManagement.java Я звоню JaasCustomAuthenticator.java метод проверки подлинности класса (), но я хочу вызвать его в SystemConfigClient.java класс перед подключением к URL-адресу службы JMX.

Есть ли какой-нибудь способ добиться этого, так как я нигде не мог найти решение.