首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在设置SecurityManager时以编程方式创建JShell

如何在设置SecurityManager时以编程方式创建JShell
EN

Stack Overflow用户
提问于 2019-08-27 02:30:15
回答 1查看 267关注 0票数 1

当之前设置了安全管理器时,我想以编程方式创建JShell。但是,这会导致访问控制异常。在没有安全管理器设置的情况下,代码可以正常工作。我认为默认情况下Java平台模块具有所有权限。

我应该设置或配置什么才能创建无任何由安全管理器引起的异常的JShell?

下面是我尝试过的代码。我使用的是OpenJDK 12.0.2。

策略文件:

代码语言:javascript
复制
grant codeBase "file:${user.dir}/-" {
    permission java.security.AllPermission;
};

java模块:

代码语言:javascript
复制
module test {

    requires jdk.jshell;
    requires java.logging;
}

类:

代码语言:javascript
复制
package test;

import jdk.jshell.JShell;

public class HelloJShell {

    public static void main(String[] args) {

        URI uri = HelloJShell.class.getResource("/conf/security/java.policy").toURI();
        Policy policy = Policy.getInstance("JavaPolicy", new URIParameter(uri));
        Policy.setPolicy(policy);

        // When the line below is commented the code works fine. 
        System.setSecurityManager(new SecurityManager());

        JShell js = JShell.create();
        System.out.println(js);
    }
}

我也试过了:

代码语言:javascript
复制
    public static void main(String[] args) {

        URI uri = HelloJShell.class.getResource("/conf/security/java.policy").toURI();
        Policy policy = Policy.getInstance("JavaPolicy", new URIParameter(uri));
        Policy.setPolicy(policy);

        System.setSecurityManager(new SecurityManager());
        AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
            try (JShell js = JShell.create()) {
                System.out.println(js);
            }
            return null;
        });
    }

我希望创建JShell时不会出现异常。

它抛出这个异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.IllegalStateException: Launching JShell execution engine threw: access denied ("java.util.logging.LoggingPermission" "control")
    at jdk.jshell/jdk.jshell.JShell.<init>(JShell.java:139)
    at jdk.jshell/jdk.jshell.JShell$Builder.build(JShell.java:405)
    at jdk.jshell/jdk.jshell.JShell.create(JShell.java:420)
    at test/test.HelloJShell.main(HelloJShell.java:10)
Caused by: java.security.AccessControlException: access denied ("java.util.logging.LoggingPermission" "control")
    at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.base/java.security.AccessController.checkPermission(AccessController.java:1044)
    at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:408)
    at java.logging/java.util.logging.LogManager.checkPermission(LogManager.java:2432)
    at java.logging/java.util.logging.Logger.checkPermission(Logger.java:622)
    at java.logging/java.util.logging.Logger.setLevel(Logger.java:2001)
    at jdk.jshell/jdk.jshell.execution.FailOverExecutionControlProvider.logger(FailOverExecutionControlProvider.java:138)
    at jdk.jshell/jdk.jshell.execution.FailOverExecutionControlProvider.generate(FailOverExecutionControlProvider.java:109)
    at jdk.jshell/jdk.jshell.spi.ExecutionControl.generate(ExecutionControl.java:179)
    at jdk.jshell/jdk.jshell.spi.ExecutionControl.generate(ExecutionControl.java:296)
    at jdk.jshell/jdk.jshell.JShell.<init>(JShell.java:136)
    ... 3 more
EN

回答 1

Stack Overflow用户

发布于 2019-08-27 08:09:32

我找到了解决方案。需要在策略文件中配置以下权限:

代码语言:javascript
复制
grant codeBase "jrt:/jdk.jshell" {
    permission java.security.AllPermission;
};

grant codeBase "jrt:/jdk.jdi" {
    permission java.security.AllPermission;
};

grant codeBase "jrt:/jdk.compiler" {
    permission java.security.AllPermission;
};

它的定义如下:https://docs.oracle.com/en/java/javase/12/security/permissions-jdk1.html#GUID-7450CEFD-8EDC-495E-A7A3-6C2561FA4999

如果使用模块化运行时镜像(请参阅jlink工具),则可以通过将jrt URL指定为策略文件中的codeBase值来授予镜像中应用程序和库模块的权限。有关jrt的更多信息,请参见JEP 220:模块化运行时图像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57663086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档