如何解决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 name 是
ObjectName
模式(参见 Javadoc):在您的情况下,tomcat.jdbc
域中的所有名称 - action 是要执行的操作:在您的情况下,Tomcat JDBC 想要向服务器注册 MBean。
您还可以尝试更严格的 ObjectName
,例如tomcat.jdbc:name=jdbc/abc,*
将权限限制为仅一个数据源。
备注:如果您不打算使用 JMX 来监控您的数据源性能,您也可以使用 jmxEnabled="false"
(参见 documentation),所有权限问题都会解决离开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。