zoukankan      html  css  js  c++  java
  • Java安全管理器――SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管理器是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络、本地文件和程序其它部分的访问限制的效果。

    Java从应用层给我们提供了安全管理机制――安全管理器,每个Java应用都可以拥有自己的安全管理器,它会在运行阶段检查需要保护的资源的访问权限及其它规定的操作权限,保护系统免受恶意操作攻击,以达到系统的安全策略。图3-1-5-1展示了安全管理器的工作机制,当运行Java程序时,安全管理器会根据policy文件所描述的策略给程序不同模块分配权限,假设把应用程序分成了三块,每块都有不同的权限,第一块有读取某文件的权限,第二块同时拥有读取某文件跟内存的权限,第三块有监听socket的权限。通过这个机制就能很好地控制程序各个部分的各种操作权限,从应用层上为我们提供了安全管理策略。图3-1-5-2为安全管理器对文件操作进行管理的工作过程,当应用程序要读取本地文件时,securitymanager就会在读取前进行拦截,判断是否有读取此文件的权限,如果有则顺利读取,否则将抛出访问异常。SecurityManager类中提供了很多检查权限的方法,例如checkPermission方法会根据安全策略文件描述的权限对操作进行判断是否有操作权限,而checkRead方法则用于判断对文件访问权限。一旦发现没有权限都会抛出安全异常。
    Java安全管理器――SecurityManager
    Java安全管理器――SecurityManager
    图3-1-5-1 安全管理机制
    Java安全管理器――SecurityManager
    Java安全管理器――SecurityManager
    图3-1-5-2 检查操作权限
    一般而言,Java程序启动时并不会自动启动安全管理器,可以通过以下两种方法启动安全管理器:
    ① 一种是隐式,启动默认的安全管理器最简单的方法就是:直接在启动命令中添加-Djava.security.manager参数即可。
    ② 一种是显式,实例化一个java.lang.SecurityManager或继承它的子类的对象,然后通过System.setSecurityManager()来设置并启动一个安全管理器。
    在启动安全管理器时可以通过-Djava.security.policy选项来指定安全策略文件。如果没有指定策略文件的路径,那么安全管理器将使用默认的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目录下面的java.policy。需要说明一下的是,=表示这个策略文件将和默认的策略文件一同发挥作用;==表示只使用这个策略文件。policy文件包含了多个grant语句,每一个grant描述某些代码拥有某些操作的权限。在启动安全管理器时会根据policy文件生成一个Policy对象,任何时候一个应用程序只能有一个Policy对象。
    那么如何才能实现自己的安全管理器,并且配置权限呢?下面将通过一个简单的例子阐明实现步骤,一般可以分为以下两步:①创建一个SecurityManager子类,并根据需要重写一些方法。②根据应用程序代码的权限需要配置策略文件。如果使用默认安全管理器则省略第一步,下面用个例子说明安全管理器的使用:
    public class SecurityManagerTest {
    public static void main(String[] args)throws FileNotFoundException {
    System.out.println("SecurityManager: " + System.getSecurityManager());
    FileInputStreamfis = new FileInputStream("c://protect.txt");
    System.out.println(System.getProperty("file.encoding"));
    分下面几种情况运行程序:
    (1) 假如不添加启动参数直接运行,则相当于没有启动安全管理器,SecurityManager打印出来为null,且能正确读取protect.txt文件跟file.encoding属性。
    (2) 添加启动参数-Djava.security.manager-Djava.security.policy=c:/protect.policy,俩参数分别代表启动默认安全管理器和指明策略配置文件路径。此时SecurityManager打印出来为不为null,但由于此时protect.policy里面并没有做任何授权,所以在读取文件的时就抛出AccessControlExcepti on异常。
    启动参数在eclipse里面的配置,在右击run configu里面的arguments的vm模块设置
    (3) 在protect.policy文件添加以下授权语句,
    grant {
    permissionjava.io.FilePermission "c:/protect.txt", "read";
    };
    此时SecurityManager不为空,并且有权限读取protect.txt文件,但最终还是会抛一个AccessControlException异常,因为并没有权限读取file.encoding系统属性。
    (4) 将protect.policy授权语句改为如下:
    grant {
    permission java.io.FilePermission "c:/protect.txt", "read";
    permission java.util.PropertyPermission "file.encoding", "read";
    };
    这次读取文件跟读取系统属性的权限都有了,程序正常运行,不再抛出安全异常。
    由上面几种情况我们清晰了解安全管理器的使用,通过简单地配置策略文件能达到应用安全的管理。Java的Permission类是用来定义类所拥有的权限,Java本身包括了一些 Permission类,如下:
    java.security.AllPermission
    所有权限的集合
    java.util.PropertyPermission
    系统/环境属性权限
    java.lang.RuntimePermission
    运行时权限
    java.net.SocketPermission
    Socket权限
    java.io.FilePermission
    文件权限,包括读写,删除,执行
    java.io.SerializablePermission
    序列化权限
    java.lang.reflect.ReflectPermission
    反射权限
    java.security.UnresolvedPermission
    未解析的权限
    java.net.NetPermission
    网络权限
    java.awt.AWTPermission
    AWT权限
    java.sql.SQLPermission
    数据库sql权限
    java.security.SecurityPermission
    安全控制方面的权限
    java.util.logging.LoggingPermission
    日志控制权限
    javax.net.ssl.SSLPermission
    安全连接权限
    javax.security.auth.AuthPermission
    认证权限
    javax.sound.sampled.AudioPermission
    音频系统资源的访问权限
  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/handsome1013/p/9890785.html
Copyright © 2011-2022 走看看