安全管理器及策略

来源:互联网 发布:软件开发设计方案模板 编辑:程序博客网 时间:2024/05/09 04:15

SecurityManager

作用:开关,是否启用沙箱环境;
启用方式:

  1. JVM启动参数中添加-Djava.security.manager;
  2. 通过代码安装System.setSecurityManager(new MySecurityManager());

沙箱策略

策略:指定某些代码对某些资源具有某些访问权限,如/home/admin目录下的代码对/logs目录下文件有只读权限,示例如下图所示:
这里写图片描述

JDK的Policy: 在任何时候JVM中只能有一个Policy对象起作用,可以通过Policy.getPolicy()查看当前安装的Policy对象(需要getPolicy权限),通过调用Policy.setPolicy()更改当前安装的Policy对象(需要setPolicy权限),通过implies()检查代码是否相应权限,并提供refresh()支持策略文件的热更新,如下图所示:
这里写图片描述
自定义Policy: 通过更改JRE的lib/security目录中安全属性文件java.security文件实现,更新属性policy.provider的值即可,如下图所示:
这里写图片描述
系统默认Policy:

  1. refresh逻辑:重新加载所有的策略文件,用于热更新;
  2. 策略文件加载:首先,加载安全属性文件java.security指定文件;其次,加载系统属性java.security.policy或者java.security.auth.policy指定文件,如下图所示:
    这里写图片描述

策略文件的语法请参考:http://hubingforever.blog.163.com/blog/static/17104057920118238033494/

Policy热更新示例:

import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.security.Policy;public class SandBoxTest {     public static void file() {         File f = new File("D:/mvn.txt");            InputStream is;            try {                is = new FileInputStream(f);                byte[] content = new byte[1024];                while (is.read(content) != -1) {                    System.out.println(new String(content));                }            } catch (Exception e) {                e.printStackTrace();            }     }    public static void main(String[] args) throws Exception {        for(int i = 0; i < 10; i++){            System.out.println(i);            file();            Thread.sleep(5000);            Policy.getPolicy().refresh(); //刷新安全策略        }    }}
原创粉丝点击