Host foo是IBM MQ客户端(即通过TCP / IP的客户端模式连接)。主机栏是运行队列管理器的系统。 Bar授予foo实例化com.ibm.mq.MQQueueManager对象的权限(通过IP地址),但不授予托管foobar的权限。
因此,我将所有IBM MQ联系人封装到在foo上运行的新应用程序中。与foobar一起,使用套接字形成客户端/服务器应用程序,其中foo是服务器而foobar是客户端。与以前一样,Foo仍然是IBM MQ客户端。
到目前为止,我在新应用程序(与MQ相关)中尝试对foo做的就是实例化一个MQQueueManager对象。这很成功,直到我介绍java.lang.SecurityManager。
通过java命令执行的本地应用程序,例如foo上的这个应用程序,默认情况下不会在安装了SecurityManager的情况下运行。现在它安装了SecurityManager。原因是控制对在foo上运行的此应用程序的访问。安全策略接受来自foobar(java.net.SocketPermission)的连接。这有效。 foo的所有者现在可以控制授予foobar的权限。
但是我们对foo和bar之间的相互作用产生了一些干扰。干扰来自SecurityManager。不要在安装了SecurityManager的情况下运行,并且foo可以实例化MQQueueManager。使用SecurityManager运行并且foo在MQQueueManager构造函数中挂起。
Foo正在使用https://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html
中描述的策略参考实现foo的以下权限导致MQQueueManager构造函数挂起。
permission java.net.SocketPermission "bar", "connect, accept";
-Dcom.ibm.msg.client.commonservices.trace.status=ON
-Djava.security.debug="access,failure"
... access denied ("java.util.PropertyPermission" "mqs.disable.all.intercept" "read") [java.security.AccessControlException] ...
... access denied ("java.util.PropertyPermission" "mqs.intercept.serializeconn" "read") [java.security.AccessControlException] ...
答案 0 :(得分:1)
IBM MQ v8 KC有一个页面" Running IBM MQ classes for Java applications under the Java Security Manager"。
此页面说明与MQ客户端连接有关:
//For the client transport type. permission java.net.SocketPermission "*","connect,resolve";
我唯一注意到的是上面示例中与您发布的内容相比缺少空格,您也不需要提供accept
权限,我还在sun文档中注意到resolve
隐含connect
所以不应该特别需要。
有很多其他设置与您可能需要的其他权限相关,因此我建议您查看上面的详细信息。
您可以使用以下java系统属性获取IBM MQ Classes for Java跟踪:
-Dcom.ibm.msg.client.commonservices.trace.status=ON
默认情况下,跟踪将输出到当前目录中名为mqjms_%PID%.trc
的文件,%PID%
被java进程的进程ID替换。
如果要指定其他文件名或路径,可以添加以下java系统属性:
-Dcom.ibm.msg.client.commonservices.trace.outputName=/tmp/x/y/z/mqjms_%PID%.trc
两个示例命令:
java -Dcom.ibm.msg.client.commonservices.trace.status=ON -Dcom.ibm.msg.client.commonservices.trace.outputName=mqjms_%PID%.trc SomeJavaApp
java安全管理器跟踪可能会有所帮助,您可以通过添加以下java系统属性来启用它:
-Djava.security.debug="access,failure"
答案 1 :(得分:0)
但是我们对foo和foo之间的相互作用产生了一些干扰 酒吧。干扰来自SecurityManager。不要跑 安装了SecurityManager,foo可以实例化 MQQueueManager。使用SecurityManager运行并且foo挂起 MQQueueManager构造函数。
这很奇怪。它在MQ文档中的位置表示使用Java SecurityManager。有人给你不好的信息。此外,您不使用SecurityManager执行MQ安全性。
foo的以下权限导致MQQueueManager构造函数挂起。 权限java.net.SocketPermission“bar”,“connect,accept”;
为什么要限制MQ客户端库可以执行的操作?如果它听不到&解决tcp通信然后它将无法正常工作。只需删除该行。