添加SecurityManager后JMS应用无法创建JNDI上下文的权限问题求助
添加SecurityManager后JMS应用无法创建JNDI上下文的权限问题求助
看起来你遇到的问题确实是SecurityManager限制了GlassFish内部依赖注入框架HK2所需的核心权限——毕竟用AllPermission能正常运行,已经直接指向了权限不足的根源。
从错误栈里的org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.internalCreate抛出的异常来看,HK2在初始化服务定位器时,因为权限不够无法生成必要的组件,进而导致SerialInitContextFactory(GlassFish的JNDI上下文工厂)实例化失败。
你的初始security.policy只覆盖了网络、文件和基本属性权限,缺少HK2和GlassFish命名服务运行所需的关键权限,这里给你几个具体的补充建议:
1. 添加反射相关权限
HK2大量依赖反射来实例化组件,需要放开反射访问限制:
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
2. 添加类加载与安全相关权限
GlassFish的内部组件需要类加载和安全上下文相关的权限:
permission java.security.SecurityPermission "createAccessControlContext"; permission java.security.SecurityPermission "getPolicy"; permission java.lang.RuntimePermission "getClassLoader"; permission java.lang.RuntimePermission "setContextClassLoader";
3. 添加HK2与GlassFish内部属性/资源访问权限
允许访问HK2和GlassFish的系统属性,以及必要的库文件:
permission java.util.PropertyPermission "com.sun.enterprise.module.single.*", "read"; permission java.util.PropertyPermission "org.glassfish.hk2.*", "read"; // 如果你的GlassFish有明确的安装目录,可以添加下面的权限(替换成实际路径) permission java.io.FilePermission "/path/to/glassfish5/glassfish/lib/*", "read"; permission java.io.FilePermission "${java.home}/lib/*", "read";
4. 精准排查缺失的权限
如果上面的权限还不够,你可以开启Java的权限调试功能,查看具体哪个权限被拒绝:
java -Djava.security.debug=access,failure -Djava.security.policy=security.policy backend.Server
运行后控制台会输出每一次权限检查的结果,找到被拒绝的权限项,补充到policy文件中即可。
最后提醒
GlassFish的客户端库(gf-client.jar、javaee.jar等)内部有大量动态加载、反射操作,当启用SecurityManager时,这些操作都需要明确的权限授权,所以不要遗漏对这些库相关的权限配置。
备注:内容来源于stack exchange,提问作者pranp2001
相关产品推荐
相关产品推荐

