2011-03-04 48 views
10

article有关Java安全说:Java安全管理器 - 它检查什么?

代码Java库咨询的 安全管理每当危险 操作将尝试。

那么,这究竟意味着什么?假设我已经实现了自己的安全管理器并为整个JVM启用了它。现在,java运行时是否会为每个java调用(例如System.out.println()等)咨询我的安全管理器,或者它仅为诸如System.exit()之类的dangerous api调用,文件操作等提供咨询?

编辑:让我澄清我的问题,

我不是质疑的SecurityManager的possiblities。我只是问是否对危险的API单独进行安全检查或者是为每个方法调用完成。在大量代码的应用程序中,这会导致性能大幅下降。

回答

15

的常量,如果代码是这么说的它只会咨询安全管理器。它不会为每一项操作做到这一点。

例如在Runtime.exit,你看到的Security咨询:

public void exit(int status) { 
SecurityManager security = System.getSecurityManager(); 
if (security != null) { 
    security.checkExit(status); 
} 
Shutdown.exit(status); 
} 

同样,在File,你会看到,大多数方法咨询安全管理器。例如:

public boolean canWrite() { 
SecurityManager security = System.getSecurityManager(); 
if (security != null) { 
    security.checkWrite(path); 
} 
return fs.checkAccess(this, FileSystem.ACCESS_WRITE); 
} 

如果您正在编写一个可能“危险”的方法,那么您还应该咨询SecurityManager。

+0

因此,它不会检查像'System.out.println()'这样的无辜操作吗? – RubyDosa 2011-03-04 11:31:00

+0

@RubyDosa不,它没有。 – dogbane 2011-03-04 11:32:52

+0

@ dogbane:那么,政策文件呢?根据下面的jpkrohling的评论,安全经理不是用它来查看什么是允许的,什么是不允许的 – namalfernandolk 2013-08-14 23:48:52

2

使用安全管理器,你可以控制访问:

  1. 文件操作
  2. 思考设施
  3. 读取/写入IO
  4. 线程/线程组操作
  5. 套接字操作(监听,接受等)
  6. 创建自己的类加载器的能力。

对于每一次这样的事情存在安全管理器

支票*()方法对于一个详尽的列表检查SecurityConstants