#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.
Есть ли какой-нибудь способ добиться этого, так как я нигде не мог найти решение.