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

Posted

技术标签:

【中文标题】org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx 注册失败【英文标题】:org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx registration failed 【发布时间】:2021-04-16 08:50:02 【问题描述】:

我想将部署 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,connections=PooledConnection[0],name=jdbc/abc ,type=ConnectionPool]", "registerMBean";

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

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

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

【问题讨论】:

任何 cmets 都会有所帮助 【参考方案1】:

这可能应该被认为是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),其中:

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

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

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

【讨论】:

以上是关于org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx 注册失败的主要内容,如果未能解决你的问题,请参考以下文章