org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx注册失败

问题描述

我想将部署 spring-boot 应用程序部署到外部 tomcat 启用安全管理器。 Jndi 在 tomcat 中配置为名称 jdbc/abc 。tomcat 在我部署时要求一些权限,我在 tomcat 的 catalina.policy 中授予这些权限。我目前收到一些访问被拒绝的消息,如下所示。

org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx registration failed.
    java.security.AccessControlException: access denied ("javax.management.MBeanPermission" "org.apache.tomcat.jdbc.pool.PooledConnection#-[tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[0],name="jdbc/abc",type=ConnectionPool]" "registerMBean")

然后我授予权限

permission javax.management.MBeanPermission "org.apache.tomcat.jdbc.pool.PooledConnection#-[tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,name=jdbc/abc,type=ConnectionPool]","registerMBean";

然后消息在服务器输出中再次重复,我不确定我是否以正确的方式授予了此权限? 谁能告诉我哪里做错了?

连接池的服务器配置如下图:

<Resource name="jdbc/abc"
                  type="javax.sql.DataSource"
                  
                  url="url to the database"
                  username="MyName"
                  password="123" 
                  /> 

解决方法

这可能应该被认为是 Tomcat JDBC 库中的一个错误:容器提供的 DataSource 应该使用 AccessController.doPriviledged 来执行 JMX 操作。它还应该提供一组权限来管理从应用程序代码到 DataSource 的访问。然而,由于 SecurityManager 可能会被弃用(参见 JEP 411),我怀疑这个错误是否会得到解决。

由于 Tomcat JDBC 注册了大量 JMX bean,我将授予所有 org.tomcat.jdbc 类在 tomcat.jdbc 域中注册任何 MBean 的权限:

permission javax.management.MBeanPermission "org.apache.tomcat.jdbc.*#-[tomcat.jdbc:*]","registerMBean";

MBeanPermission 是通过以下方式授予的:

permission javax.management.MBeanPermission "class name#member[object name]","action"

(参见Javadoc),其中:

  • class name 是执行调用的类。在您的情况下,所有 Tomcat JDBC 类,
  • member 是您要访问的 JMX 属性,不适用于 registerMBean 操作,
  • object nameObjectName 模式(参见 Javadoc):在您的情况下,tomcat.jdbc 域中的所有名称
  • action 是要执行的操作:在您的情况下,Tomcat JDBC 想要向服务器注册 MBean。

您还可以尝试更严格的 ObjectName,例如tomcat.jdbc:name=jdbc/abc,* 将权限限制为仅一个数据源。

备注:如果您不打算使用 JMX 来监控您的数据源性能,您也可以使用 jmxEnabled="false"(参见 documentation),所有权限问题都会解决离开。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...