在查看java Thread源码的时候发现一个类----securityManager,虽然很早就知道存在这样一个类但是都没有深究,今天查看了它的api和源码,发现这个类功能强大,可以做很多权限控制策略的限制.所以在这里进行以下记录.

  1.首先说一下securityManager类的定义(来自APi): 安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。个人觉得这个解释还是不算太容易理解,我觉得这个类就是进行权限控制的,我们可以通过这个类来控制系统是否能做什么或者是不能做什么.

  2.获取securityManager的方法: 通过观察源码发现,我们可以通过set和get方法类设置/获取securityManager.

  3.进行权限校验的方法:  checkPermission(Permission) 方法,我们可以通过此方法来获取当前操作是否被securityManager允许,如果不被允许则抛出异常.当然此类也提供方法进行制定上下文的校验,checkPermission(Permission,AccessControlContext),我们可以通过制定AccessControlContext来判断这个操作在制定AccessControlContext中是否合法.

  4.权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是java.io.FilePermissionjava.net.SocketPermissionjava.net.NetPermissionjava.security.SecurityPermissionjava.lang.RuntimePermissionjava.util.PropertyPermissionjava.awt.AWTPermissionjava.lang.reflect.ReflectPermission和 java.io.SerializablePermission。FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。像这些命名语法比 BasicPermission 所用的语法更为复杂的类都直接是 Permission 的子类,而不是 BasicPermission 的子类。(来自API)

  4. 实现方法:实现securityManager的方法主要有两类:  

一般而言,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 API

     某大牛博客

java线程基础知识----SecurityManager类详解的更多相关文章

  1. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  2. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  3. Linux基础知识之挂载详解(mount,umount及开机自动挂载)

    Linux基础知识之挂载详解(mount,umount及开机自动挂载) 转载自:http://www.linuxidc.com/Linux/2016-08/134666.htm 挂载概念简述: 根文件 ...

  4. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  5. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  6. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  7. java线程基础知识----java daemon线程

    java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...

  8. Java 线程基础知识

    前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...

  9. Java提高学习之Object类详解(1)

    转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父 ...

随机推荐

  1. 普通java类加入spring容器的四种方式

    今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...

  2. kreuz-frankfurt-sample-generic-2019-02-08.xodr文件解读

    第1行:xml语法所遵循的版本. L2:文件封装标记. L3:Opendrive的主要修订编号  次要修订编号   供应商. L4:记录有关地理参考坐标系的参数,投影-横轴墨卡托   a-地球椭球长半 ...

  3. Python基础-数据写入execl

    import xlwt book = xlwt.Workbook()#创建一个excel sheet = book.add_sheet('lanxia')#添加一个sheet页 title = ['姓 ...

  4. Abp模块分析

    1.什么是模块? 模块化是一种处理复杂系统分解为更好的可管理模块的方式.模块化用来分割,组织和打包软件.每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功 ...

  5. BEC listen and translation exercise 42

    These were built for the workers towards the end of the eighteenth century, and they are still furni ...

  6. codeforces 627B B. Factory Repairs(线段树)

    B. Factory Repairs time limit per test 4 seconds memory limit per test 256 megabytes input standard ...

  7. codeforces 628B B. New Skateboard (数论)

    B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. objdump 命令的用法

    gcc命令之 objdump ---------------objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具---------- 以下3条命令足够那些喜欢探索目标文件与源代码之间的 ...

  9. Struts2 - 通过实现 Aware 接口访问 Web 资源

    Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 ...

  10. C语言小程序(二)、计算第二天日期

    输入一个日期,判断下一个日期是哪一天,如果日期输入错误,则调用Linux下的cal命令显示输入的月份. #include <stdio.h> #include <stdlib.h&g ...