科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道深入理解Java安全模型

深入理解Java安全模型

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们仔细研究了Java安全模型的结构。我又深入研究了Java安全机制的另一个方面,也就是安全管理、访问控制器和访问许可。安全管理是一个特别的类型,它指出一类允许访问的资源.

2007年4月29日

关键字: 虚拟机 软件工程 安全 java Office

  • 评论
  • 分享微博
  • 分享邮件

上周,我们仔细研究了Java安全模型的结构。本周,我又深入研究了Java安全机制的另一个方面,也就是安全管理、访问控制器和访问许可。

安全管理器

安全管理是一个特别的类型,它指出一类允许访问的资源(例如,文件访问或者网络连接)。做出是否允许访问的决定,安全管理器需要分析发出请求的来源。如果访问被拒绝,将产生一个Java安全异常(java.lang.SecurityException)。否则,将以正常的方式进行调用。

每一个Java虚拟机(Java Virtual Machine)进程都只允许存在一个安全管理器。另外,您可以配置JVM,这样就可以使JVM创建安全管理器后,不再允许替换安全管理器。在这种情况下,一个安全管理器将存在于JVM的整个生命周期。许多JVM中嵌入了浏览器,它能在第一个Java程序下载到它里面之前创建一个单个的安全管理器。这样的话,电脑黑客就不能用后来的未经授权访问系统资源的Java程序来替换Web浏览默认的安全管理器了。

使用Java 2比使用以前的版本,更容易创建定制的安全管理器,因为您可以在Java 2中配置默认的安全管理器。如果您想使用默认的安全管理器,就要利用系统特性了,可以在命令行方式下让JVM知道您的决定。它必须以下面的方式进行设置:

    java –Djava.security.managerMyApplication
    java –Djava.security.manager=default MyApplication

java.lang.SecurityManager类是一个允许应用程序实现安全策略的抽象类,它为正在运行的JVM提供安全策略。Java.lang.System.getSecurityManager()方法将一个引用返回到当前的SecurityManager对象中。如果它不存在,则返回一个NULL值。您可以调用java.lang.System.setSecurityManager()方法设置您自己的安全管理器。如果它被禁止安装新的安全管理器,就会抛出SecurityException异常。

SecurityManager类包括许多以checkXXX()命名的public方法。每一个方法都要检查相应的资源是否被允许访问;如果它被拒绝,则要抛出SecurityException异常。

checkPermission()方法与所有的checkXXX()方法相关联。在Java 2中执行,调用任何checkXXX()方法都会调用checkPermission()这个方法。checkPermission()方法会在java.security.AccessController类中去调用同名的方法。

访问控制器

AccessController类通常可以获得一个详细的访问控制,这是新的Java安全模型(从Java 1.3开始)的一个主要特征。SecurityManager一直被应用于Java上,它是向后兼容的,访问控制器是在AccessController类中被管理的(这就是为什么该类的SecurityManager没有在Java 2中被推荐使用的原因)。例如,您可以用下面的方法来实现SecurityManager.checkRead(String fileName)方法:

    checkPermission(new FilePermission(fileName,"read"));

下面的语句告诉您如何使用SecurityManager.checkPermission(Permission permission)方法:

    java.security.AccessController.checkPermission(permission);

AccessController类决定哪些允许访问(使用checkPermission()方法,该方法确定应该批准还是拒绝由指定权限所指示的访问请求;假如这样的话,它还要使用doPrivileged()方法),还要决定是否允许您得到在当前访问管理上下文的引用(使用getContext()方法)。

AccessControlContext类决定它所封装的上下文是否允许对系统资源进行访问。它可以包括一个或多个ProtectionDomain类。每一个类都包括对特殊代码段的存取权限。ProtectionDomain类包括两个类:PermissionCollection类用于存储权限集,CodeSource类用于保存代码在URL格式中的位置信息。它也可以在SignedBy类中保存签名信息,SignedBy类中包括一个Certificate对象数组。代码接收来自同一个来源且在同一个Protection Domain(保护域)中的同一个人的签名。AccessControlContext对象的checkPermission()方法针对当前的上下文,检查与ProtectionDomain对象相关的访问权限的设置。

doPrivileged()能在运行时启用特权,执行指定的操作。如果使用doPrivileged(),就会用到被简化的决策程序。一般用到doPrivileged()方法的时候,也会使用到PrivilegedAction界面,这个界面不会产生异常。

AccessController.doPrivileged(new PrivilegedAction() {
      Public Object run() {
            // privileged action can return some value or null
      } }


);

doPrivileged()方法的第二个参数是AccessControlContext对象,这个参数表示在执行指定操作前,应用于调用方的域特权的限制条件。AccessController的getcontext()方法可以得到上下文并使用它们。

访问许可

Java 2包括一个非常好的许可管理平台。这个结构的基础是抽象类java.security.Permission,这个抽象类描述了访问权限实体。它包括资源的目标名(如文件名)和能在那些资源上执行的操作的字符串(如,“读,写”)。Permission.implies(Permission)方法表示,如果一个Permission对象所给的参数是allowed——那么当前Permission对象是也被允许的。对象Permission实现了java.security.Guard界面。Permission类包括许多用于不同目的的子类。这些子类的大部分都有两个构造器——PermissionSubclass(String name) 和PermissionSubclass(String name, String actions)——name表示目标资源名,actions表示需要执行的操作字符串。下面给出了默认的Permission子类中的其中四个:

AllPermission():允许所有的资源。
FilePermission(String fileName, String access): 针对文件访问的许可。Access字符串可以是"read," "write," "delete,"和 "execute",使用多个的话,中间用“,”分隔。
PropertyPermission(String prop,String access): 针对属性设置的许可。
SocketPermission(String address,String access):针对网络socket连接的许可。Address字符串可以是URL格式或者是IP格式的;access字符串可以是“accept”或者是“connect”两种操作。


责任编辑:张琎

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章