从独立的Java客户端以编程方式创建WebLogic用户

从独立的Java客户端以编程方式创建WebLogic用户

问题描述:

我试图以简单的独立Java客户端(一个类 - >两种方法:createWeblogicUser()& main())以编程方式在WebLogic(10.3.4)中创建用户。从独立的Java客户端以编程方式创建WebLogic用户

public void createWeblogicUser() { 
try { 
    Hashtable<String, String> env = new Hashtable<String, String>(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
    env.put(Context.SECURITY_PRINCIPAL, "weblogic"); 
    env.put(Context.SECURITY_CREDENTIALS, "weblogic"); 
    env.put(Context.PROVIDER_URL, "t3://myserver:7001"); 

    InitialContext ctx = new InitialContext(env); 
    MBeanServer wls = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime"); 

    ObjectName userEditor = null; 
    ObjectName mBeanTypeService = new ObjectName("com.bea:Name=MBeanTypeService, Type=weblogic.management.mbeanservers.MBeanTypeService"); 
    ObjectName rs = new ObjectName("com.bea:Name=RuntimeService, Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean"); 
    ObjectName domainMBean = (ObjectName) wls.getAttribute(rs, "DomainConfiguration"); 
    ObjectName securityConfig = (ObjectName) wls.getAttribute(domainMBean, "SecurityConfiguration"); 
    ObjectName defaultRealm = (ObjectName) wls.getAttribute(securityConfig, "DefaultRealm"); 
    ObjectName[] authProviders = (ObjectName[]) wls.getAttribute(defaultRealm, "AuthenticationProviders"); 

    for(ObjectName providerName : authProviders) { 
     if(userEditor == null) { 
      ModelMBeanInfo info = (ModelMBeanInfo) wls.getMBeanInfo(providerName); 
      String className = (String) info.getMBeanDescriptor().getFieldValue("interfaceClassName"); 
      if(className != null) { 
       String[] mba = (String[]) wls.invoke(mBeanTypeService 
                , "getSubtypes" 
                , new Object[] {"weblogic.management.security.authentication.UserEditorMBean"} 
                , new String[] {"java.lang.String"} 
              ); 
       for(String mb : mba) { 
        if(className.equals(mb)) 
         userEditor = providerName; 
       } 
      } 
     } 

     if(userEditor == null) 
      throw new RuntimeException("Could not retrieve user editor"); 

     try { 
      wls.invoke(userEditor 
         , "createUser" 
         , new Object[] {"wls_user", "password123","User created programmatically."} 
         , new String[] {"java.lang.String", "java.lang.String","java.lang.String"} 
      ); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

     ctx.close(); 
    } 
} 
catch(Exception ex) { 
    ex.printStackTrace(); 
} 

}

上下文查找我应该怎样做任何想法? “java:comp”会抛出一个javax.naming.NameNotFoundException;看起来像我只能从容器中使用它。

得到它的工作。

private void createWeblogicUser(String username) { 
try { 
    Hashtable<String, String> env = new Hashtable<String, String>(); 
    env.put(Context.SECURITY_PRINCIPAL, "weblogic"); 
    env.put(Context.SECURITY_CREDENTIALS, "weblogic"); 

    String hostname = "myserver"; 
    int port = 7001; 
    String protocol = "rmi"; 
    String url= new String("/jndi/iiop://myserver:7001/weblogic.management.mbeanservers.domainruntime"); 

    JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, url); 
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL, env); 
    MBeanServerConnection connection = connector.getMBeanServerConnection(); 

    ObjectName userEditor = null; 
    ObjectName mBeanTypeService = new ObjectName("com.bea:Name=MBeanTypeService,Type=weblogic.management.mbeanservers.MBeanTypeService"); 
    ObjectName rs = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean"); 
    ObjectName domainMBean = (ObjectName) connection.getAttribute(rs, "DomainConfiguration"); 
    ObjectName securityConfig = (ObjectName) connection.getAttribute(domainMBean, "SecurityConfiguration"); 
    ObjectName defaultRealm = (ObjectName) connection.getAttribute(securityConfig, "DefaultRealm"); 
    ObjectName[] authProviders = (ObjectName[]) connection.getAttribute(defaultRealm, "AuthenticationProviders"); 

    for(ObjectName providerName : authProviders) { 
     System.out.println("Auth provider is: " + providerName) ; 

     if(userEditor == null) { 
      ModelMBeanInfo info = (ModelMBeanInfo) connection.getMBeanInfo(providerName); 
      String className = (String) info.getMBeanDescriptor().getFieldValue("interfaceClassName"); 
      System.out.println("className is: " + className) ; 

      if(className != null) { 
       String[] mba = (String[]) connection.invoke(mBeanTypeService 
             , "getSubtypes" 
             , new Object[] {"weblogic.management.security.authentication.UserEditorMBean"} 
             , new String[] {"java.lang.String"} 
            ); 
       for(String mb : mba) { 
        System.out.println("Model Bean is: " + mb) ; 
        if(className.equals(mb)) { 
         System.out.println("Found a macth for the model bean and class name!") ; 
         userEditor = providerName; 
        } 
       } 
      } 
     } 
    } 

    if(userEditor == null) 
     throw new RuntimeException("Could not retrieve user editor"); 

    try { 
     connection.invoke(userEditor 
        , "createUser" 
        , new Object[] {username, "password123","User created programmatically."} 
        , new String[] {"java.lang.String", "java.lang.String","java.lang.String"} 
     ); 

     System.out.println("User created successfully") ; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

    connector.close(); 

} 
catch(Exception ex) { 
    ex.printStacktrace(); 
} 

}

你只需要在类路径的weblogic.jar和wljmxclient.jar。我在JDK 1.6.0_29上运行了这个。我必须补充一点,我在安装了WebLogic的机器上运行这个。所以classpath条目是jar文件的完全限定路径名。

我遇到了一个“疑难杂症”: 在提供“com.bea:Name = XXXX,Type = XXXX”的同时,不给冒号之间留出空格 - 不是逗号;什么都没有 - 我花了一些时间调试它,然后才终于找到它。

+0

很棒的工作!感谢分享这个结果。 – kvatashydze 2016-04-18 18:23:50