Java SecurityManager说明

 
public class SecurityManager
  
  
   
   extends 
   
   Object
  
  

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。

SecurityManager 包含了很多名称以 check 开头的方法。Java 库中的各种方法在执行某些潜在的敏感操作前可以调用这些方法。对 check 方法的典型调用如下:

     SecurityManager security = System.getSecurityManager();
     if (security != null) {
         security.checkXXX(argument,  . . . );
     }
 

因此,安全管理器通过抛出异常来提供阻止操作完成的机会。如果允许执行该操作,则安全管理器例程只是简单地返回,但如果不允许执行该操作,则抛出一个 SecurityException。该约定的惟一例外是 checkTopLevelWindow,它返回 boolean 值。

当前的安全管理器由 System 类中的 setSecurityManager方法设置。当前的安全管理器由 getSecurityManager 方法获取。

  特殊方法 checkPermission(java.security.Permission)负责确定是应该允许还是拒绝由指定权限所指示的访问请求。默认的实现调用 

   AccessController.checkPermission(perm);
 

如果允许访问请求,则返回 checkPermission。如果拒绝访问请求,则抛出 SecurityException。 

从 Java 2 SDK v1.2 开始,SecurityManager 中其他所有 check方法的默认实现都是调用 SecurityManager checkPermission方法来确定调用线程是否具有执行所请求操作的权限。

  注意,只带有单个权限参数的 checkPermission方法总是在当前执行的线程上下文中执行安全检查。有时,应该在给定上下文中进行的安全检查实际上需要在不同  的上下文(例如,在一个辅助线程中)中进行。Java 为这种情况提供了包含有上下文参数的 getSecurityContext方法和 checkPermission方法。getSecurityContext 方法返回当前调用上下文的一个“快照”(默认的实现返回一个 AccessControlContext 对象)。下面是一个示例调用: 

   Object context = null;
   SecurityManager sm = System.getSecurityManager();
   if (sm != null) context = sm.getSecurityContext(); 
 

checkPermission方法使用一个上下文对象,以及根据该上下文而不是当前执行线程的上下文作出访问决策的权限。因此另一个上下文中的代码可以调用此方法,传递权限和以前保存的上下文对象。下面是一个示例调用,它使用了以前示例中获得的 SecurityManager sm: 

   if (sm != null) sm.checkPermission(permission, context);
 

权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是 java.io.FilePermissionjava.net.SocketPermissionjava.net.NetPermissionjava.security.SecurityPermissionjava.lang.RuntimePermissionjava.util.PropertyPermissionjava.awt.AWTPermissionjava.lang.reflect.ReflectPermissionjava.io.SerializablePermission。 

除前两个(FilePermission 和 SocketPermission)类以外的所有类都是 java.security.BasicPermission 的子类,而 java.security.BasicPermission 类又是顶级权限类 java.security.Permission 的抽象子类。BasicPermission 定义了所有权限所需的功能,这些功能的名称遵从分层属性命名惯例(例如“exitVM”、“setFactory”、“queuePrintJob”等等)。在名称的末尾可能出现一个星号,前面是“.”或星号,这表示通配符匹配。例如:“a.*”、“*”是有效的,而“*a”或“a*b”是无效的。

FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。像这些命名语法比 BasicPermission 所用的语法更为复杂的类都直接是 Permission 的子类,而不是 BasicPermission 的子类。例如,对于 java.io.FilePermission 对象而言,权限名就是文件(或目录)的路径名。

某些权限类具有一个“操作”列表,告知允许对象所执行的操作。例如,对于 java.io.FilePermission对象,操作列表(如“读、写”)指定了允许对指定文件(或指定目录中的文件)执行哪些操作。

其他权限类是“命名”权限 - 有名称但没有操作列表的类;您也许有命名的权限,也许没有。

注:还有一个暗指所有权限的 java.security.AllPermission权限。该权限是为了简化系统管理员的工作而存在的,因为管理员可能需要执行很多需要所有(或许多)权限的任务。

有关权限相关的信息,请参阅《Permissions  in the JDK》。例如,本文档包括一个列出各种 SecurityManager 的 check方法和每个方法的默认实现所需的权限表。它还包含了版本 1.2 方法所需权限和每个方法需要哪些权限的表。

有关 JDK 中对 SecurityManager 所作更改的更多信息和关于 1.1 风格安全管理器移植的建议,请参阅《security  documentation》。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaManager 是一种安全管理工具,用于控制 Java 应用程序的安全权限。它可以限制应用程序访问系统资源的能力,例如文件系统、网络、系统属性等等。下面给出一些常见的用法和示例代码: 1. 禁止访问文件系统: ``` SecurityManager sm = new SecurityManager() { public void checkRead(String file) { throw new SecurityException("Access denied!"); } }; System.setSecurityManager(sm); ``` 这段代码会禁止应用程序读取任何文件,因为在调用文件读取方法之前,SecurityManager 的 checkRead 方法会被调用。如果该方法抛出异常,则文件读取操作将失败。 2. 禁止访问网络: ``` SecurityManager sm = new SecurityManager() { public void checkConnect(String host, int port) { throw new SecurityException("Access denied!"); } }; System.setSecurityManager(sm); ``` 这段代码会禁止应用程序连接任何网络主机。在调用网络连接方法之前,SecurityManager 的 checkConnect 方法将被调用。如果该方法抛出异常,则连接操作将失败。 3. 禁止访问系统属性: ``` SecurityManager sm = new SecurityManager() { public void checkPropertyAccess(String key) { throw new SecurityException("Access denied!"); } }; System.setSecurityManager(sm); ``` 这段代码会禁止应用程序访问任何系统属性。在调用 System.getProperty 方法之前,SecurityManager 的 checkPropertyAccess 方法将被调用。如果该方法抛出异常,则属性访问操作将失败。 需要注意的是,SecurityManager 的使用需要在程序启动时进行设置,一旦设置后就无法更改。同时,SecurityManager 的效果取决于 Java 虚拟机的实现,不同的实现可能会有不同的限制。 以上是常见的用法示例,更多详细用法可以查看官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值