SecurityManager
先看说明书…JDK文档的解释如下:
安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。
SecurityManager 类包含了很多名称以单词 check 开头的方法。
Java 库中的各种方法在执行某些潜在的敏感操作前可以调用这些方法。
对 check 方法的典型调用如下:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
checkPermission
方法使用一个上下文对象,以及根据该上下文而不是当前执行线程的上下文作出访问决策的权限。因此另一个上下文中的代码可以调用此方法,传递权限和以前保存的上下文对象。下面是一个示例调用,它使用了以前示例中获得的SecurityManager sm
:if (sm != null) sm.checkPermission(permission, context);
权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是
java.io.FilePermission
、java.net.SocketPermission
、java.net.NetPermission
、java.security.SecurityPermission
、java.lang.RuntimePermission
、java.util.PropertyPermission
、java.awt.AWTPermission
、java.lang.reflect.ReflectPermission
和java.io.SerializablePermission
。
有什么用?
一般来说我们写程序是用不到安全管理器的,因为我们只会执行我们自己写的代码,别人的?自己的时都没弄好还想着别人?
但是总会有特殊需求的时候,比如说早期Apple还很火的时候,在浏览器上你执行的是别人的代码、别人的 Java Apple小程序,你就得需要一个安全管理器,用于限制代码的执行权限。再比如说我们的OJ…
怎么用?
一般来说安全管理器默认是不开启的,我们要手动地开启,执行cmd
命令 或下面的代码:
System.setSecurityManager(new SecurityManager());
这条代码会设置一个默认的安全管理器,具体的规则是写在一个文件里的,大概路径为:${java.home}/jre/security/java.policy
文件里面默认的内容是这样的:
// Standard extensions get all permissions by default
grant codeBase "file:${
{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more