安全管理器及策略
阿新 • • 發佈:2019-01-04
SecurityManager
作用:開關,是否啟用沙箱環境;
啟用方式:
- JVM啟動引數中新增-Djava.security.manager;
- 通過程式碼安裝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:
- refresh邏輯:重新載入所有的策略檔案,用於熱更新;
- 策略檔案載入:首先,載入安全屬性檔案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(); //重新整理安全策略
}
}
}