Fla*_*vio 6 java swing securitymanager
我正在构建一个SWING应用程序,还需要编写一个自定义的SecurityManager.如果我写一个像这样扩展SecurityManager的空类
public class Sandbox extends SecurityManager {}
Run Code Online (Sandbox Code Playgroud)
它运行正常,这意味着GUI被正确呈现,并且所有特权(如I/O)都被撤销.但是我需要自定义checkPermission方法,每当我覆盖它时,任何东西都不再有效......为什么即使是这样的东西也不行?
public class Sandbox extends SecurityManager {
@Overide
public void checkPermission(Permission perm) {
super.checkPermission(perm);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:显示问题的一个非常基本的例子就是这个
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);
}
Run Code Online (Sandbox Code Playgroud)
删除"checkPermission"方法应用程序正常工作,但我真的无法理解这一点.
如果你调用超类,checkPermission(p)你就不必首先覆盖该类。注释掉,然后就可以了。
超类的调用java.security.AccessController.checkPermission(perm)似乎会抛出一个java.security.AccessControlException, 当没有被调用时java.lang.SecurityManager
就我而言,它说:
Could not load Logmanager "null"
java.security.AccessControlException: access denied (java.util.PropertyPermission java.util.logging.manager read)
Run Code Online (Sandbox Code Playgroud)
ETC。
public class SecurityManagerExample
{
public static void main(String[] args)
{
System.setSecurityManager(new SecurityManager()
{
@Override
public void checkPermission(Permission p)
{
//super.checkPermission(p);
}
});
new JFrame().setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了有关如何编写安全管理器的教程。我还建议您阅读 java 文档和 oracle 提供的示例。
更新
查看方法摘要并覆盖您要禁止的功能。据我发现,您还需要明确允许您想要的功能。
这里有一个例子:
public class SecurityManagerExample
{
public static void main(String[] args)
{
System.setSecurityManager(new SecurityManager()
{
@Override
public void checkWrite(String file) {
// no exception is thrown, i. e. creating files is allowed in general
}
@Override
public void checkDelete(String file)
{
if (file.equals("test.xml"))
{
throw new SecurityException("Not allowed to delete test.xml!");
}
}
});
File f = new File("test.xml");
try
{
f.createNewFile();
}
catch (IOException e)
{
}
f.delete();
}
}
Run Code Online (Sandbox Code Playgroud)
输出
Exception in thread "main" java.lang.SecurityException: Not allowed to delete test.xml!
at main.SecurityManagerExample$1.checkDelete(SecurityManagerExample.java:60)
at java.io.File.delete(File.java:902)
at main.SecurityManagerExample.main(SecurityManagerExample.java:74)
Run Code Online (Sandbox Code Playgroud)