1. 程式人生 > >安全管理器及策略

安全管理器及策略

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指定檔案,如下圖所示:
    這裡寫圖片描述

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(); //重新整理安全策略 } } }