gpt4 book ai didi

Java SecurityManager @Override public void checkPermission(Permission perm)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:59 24 4
gpt4 key购买 nike

我正在构建一个 SWING 应用程序,还需要编写一个自定义 SecurityManager。如果我写一个像这样扩展 SecurityManager 的空类

public class Sandbox extends SecurityManager {}

它工作正常,这意味着 GUI 被正确呈现并且所有权限(如 I/O)都被撤销。但是,我需要自定义 checkPermission 方法,每当我重写它时,它就不再起作用了……为什么连这样的东西都不行??

public class Sandbox extends SecurityManager {
@Overide
public void checkPermission(Permission perm) {
super.checkPermission(perm);
}
}

更新:显示问题的一个非常基本的例子是这个

public static void main(String[] args) {

System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission p) {
if (some_condition_here) {
// Do something here
} else {
// Resort to default implementation
super.checkPermission(p);
}
}
});

new JFrame().setVisible(true);

}

删除应用程序正常工作的“checkPermission”方法,但我真的无法解决这个问题。

最佳答案

权限是根据堆栈上的所有代码授予的。所有调用者都必须具有所需的权限。如果您覆盖该方法并调用父类(super class)方法,您的代码也在堆栈上,这意味着您的代码库(您的自定义 SecurityManager 所属的位置)必须具有您(您的调用者)请求的权限。

这就是覆盖与不覆盖的区别。如果您不重写该方法,则只有(可能具有特权的)调用者的代码在堆栈上,并且它将获得请求的权限。如果您重写该方法,您的代码也在堆栈上并且也必须具有权限。

因此,如果您想实现一个调用继承检查方法的自定义 SecurityManager,您必须配置继承(基于策略)逻辑,为您的 SecurityManager 提供它应该能够授予的所有权限。建议将 SecurityManager 与应用程序的其余部分分离到不同的代码库中,这样只有 SecurityManager 而没有其他任何东西可以获得慷慨的权限。

关于Java SecurityManager @Override public void checkPermission(Permission perm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18597949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com