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

Java从应用层给我们提供了安全管理机制——安全管理器,每个Java应用都可以拥有自己的安全管理器,它会在运行阶段检查需要保护的资源的访问权限及其它规定的操作权限,保护系统免受恶意操作攻击,以达到系统的安全策略。图3-1-5-1展示了安全管理器的工作机制,当运行Java程序时,安全管理器会根据policy文件所描述的策略给程序不同模块分配权限,假设把应用程序分成了三块,每块都有不同的权限,第一块有读取某文件的权限,第二块同时拥有读取某文件跟内存的权限,第三块有监听socket的权限。通过这个机制就能很好地控制程序各个部分的各种操作权限,从应用层上为我们提供了安全管理策略。图3-1-5-2为安全管理器对文件操作进行管理的工作过程,当应用程序要读取本地文件时,securitymanager就会在读取前进行拦截,判断是否有读取此文件的权限,如果有则顺利读取,否则将抛出访问异常。SecurityManager类中提供了很多检查权限的方法,例如checkPermission方法会根据安全策略文件描述的权限对操作进行判断是否有操作权限,而checkRead方法则用于判断对文件访问权限。一旦发现没有权限都会抛出安全异常。

图3-1-5-1 安全管理机制

图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异常。

(3)  在protect.policy文件添加以下授权语句,

grant {

permissionjava.io.FilePermission "c:/protect.txt", "read";

};

此时SecurityManager不为空,并且有权限读取protect.txt文件,但最终还是会抛一个AccessControlException异常,因为并没有权限读取file.encoding系统属性。

(4)  将protect.policy授权语句改为如下:

grant {

permissionjava.io.FilePermission "c:/protect.txt", "read";

permissionjava.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

音频系统资源的访问权限

原文:http://blog.csdn.net/wangyangzhizhou/article/details/38497755

java的安全管理器_Java安全管理器——SecurityManager相关推荐

  1. java 类加载 双亲委派_java类加载器和双亲委派模型

    一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class文件加载所需的类,主要场景用于热部署.代码热替换等场景. 系统提供3种的类加载器:Bootstrap ClassLoad ...

  2. java classloader详解_Java类加载器(ClassLoader)详解

    本文主要讲述Java ClassLoader的工作原理,这为后面将Android App代码热替换或者插件化升级做铺垫 一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class ...

  3. java 装饰器_JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  4. java 类加载器_Java 类加载器

    一.概述 类加载器通过一个类的全限定名来获取描述此类的二进制字节流. 类加载器在类层次划分.OSGi.热部署.代码加密等领域发挥着重要的作用. 比较两个类是否"相等",只有在这两个 ...

  5. java引导类加载器_Java类加载器层次结构(一)

    类加载器有一种父/子关系.除了引导类加载器外,每个类加载器都有一个父类加载器.本章通过分析ClassLoader的源码来展示java类加载器的层次结构. 根据规定,类加载器会为它的父类加载器提供一个机 ...

  6. java 媒体播放器_Java多媒体播放器(三)

    No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...

  7. java类加载器_JAVA类加载器

    虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...

  8. java 类加载 双亲委派_Java类加载器和双亲委派机制

    前言 之前详细介绍了Java类的整个加载过程(类加载机制详解).虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括. 1)加载:查找并加载类的二进制字节流数据. 2)验证:保证被 ...

  9. java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)

    首先纠正一个误区: 热部署不是我们在Eclipse里面修改了代码不用重启就可以持续调试. 详情可以参考上一篇博文: 热部署和"Hot Code Replace"的区别    htt ...

最新文章

  1. 手把手教你洞悉 PyTorch 模型训练过程,彻底掌握 PyTorch 项目实战!(文末重金招聘导师)...
  2. 浅析C# new和override的区别
  3. hinton、李飞飞支持的NLP明星创企,今获1.25 亿美元B轮融资
  4. 内存申请与一级二级指针
  5. Java描述设计模式(10):组合模式
  6. scp复制linux系统的文件文件到本机(windows)以及本机文件复制到远程的命令
  7. linux lsm模块,Linux安全模块LSM研究及改进
  8. eclipse插件本地扩展安装
  9. 为增强软件供应链安全,NIST 发布《开发者软件验证最低标准指南》
  10. Java面试题:synchronized和对象的访问定位的两种方式
  11. c语言圆形体体积计算器,圆的半径计算软件
  12. Keras实现小数量集图片分类——6类别Birds数据集分类
  13. AWS 获取AccessKey和密钥,上传文件到s3
  14. python上方菜单栏不见了_python tkinter-菜单栏
  15. 帧中继网络与NBMA/P2MA
  16. 使用html5写见缝插针源码,HTML5见缝插针手机游戏代码-闯三关送口红.zip
  17. 华为、蚂蚁金服等都在招聘的大数据开发,需要具备哪些技能
  18. C/C++非专家级编程
  19. 马斯克:需要300T电池
  20. 简历推荐_26位AI产品经理

热门文章

  1. 难忘2006的一丝感情
  2. 计算机常用英语(键盘符号)
  3. MFC中UpdateData(TRUE) 和UpdateData(FALSE) 区别
  4. linux arm 地址映射 ioremap_nocache 使用,ioremap_nocache 函数分析(二)
  5. winform 实现动画效果。
  6. 4种方法让SpringMVC接收多个对象
  7. Android系统连按5次电源键,连按5次手机电源键竟有这个功能,紧急情况很有用,大家都该知道...
  8. sallen-因果图法设计测试用例
  9. 谷歌词霸和有道词典的使用体会
  10. 对话 ONES 联合创始人兼 CTO 冯斌:技术管理者如何打造一支自驱型团队?