如何在 spring 引导中为 JMX 设置身份验证凭据?

how to set authentication credentials for JMX in spring boot?

我在我的 spring boot 应用程序中启用了 JMX。我能够 set/get 使用 Jconsole 的属性。 我想添加 authentication (username/password) 以连接到 MBeanServer。如果可能的话,我更喜欢基于注释。

这是我的 JMXBean.

@ManagedResource(objectName = "Examples:type=JMX,name=Resource")
public class Resource {
    List<String> items = new ArrayList<>();

    @ManagedAttribute
    public String getLastItem() {
        return items.get(getSize()-1);
    }

    @ManagedAttribute
    public int getSize() {
        return items.size();
    }

    @ManagedOperation
    public void addItem(String item) {
        items.add(item);
    }

    @ManagedOperation
    public String getItem(int pos) {
        return items.get(pos);
    }

    @ManagedOperation
    public List<String> getItems() {
        return items;
    }


}

目前我没有任何XML配置。

我在我的配置中初始化了 bean

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Bean
    public Resource jmxResource() {
        return new Resource();
    }
}

要启用 远程 JMX 访问,您需要使用以下 JVM 参数启动 Spring 引导应用程序:

-Dcom.sun.management.jmxremote.port=<port>

要配置基于文件的密码身份验证,请添加以下参数:

-Dcom.sun.management.jmxremote.password.file=<file>

有两个预定义用户:monitorRolecontrolRole。默认情况下,前者只有读取权限,后者也可以写入(参见 $JRE_HOME/lib/management/jmxremote.access)。使用 $JRE_HOME/lib/management 中的 jmxremote.password.template 作为密码文件的模板并坚持使用这些用户名。例如:

monitorRole <password>
controlRole <password>

使用您指定的这些用户名和密码之一登录。

请注意,使用此方法时,密码以纯文本形式存储, 推荐用于生产。请参阅 documentation,了解如何使用 SSL 客户端证书或 LDAP 设置身份验证。