[JAVA] SecurityManager
SecurityManager
# import java.lang.SecurityManager;
SecurityManger允許app實做各自的security policy, 用來做access control check.
當然JVM本身也有實做自己的SecurityManger, 在執行前調用checkPermission()確認是否有執行請求的操作權限(ex. File, Socket, Net, Runtime, Property, AWT, Reflect跟Serializable), 不過一般都不會invoke它.
invoke JVM SM的方式有兩種:
(1)在CLI下加上 "-Djava.security.manager", 安裝built-in default SM.
ex. java -Djava.security.manager Myapp
(2)在app中加入setSecurityManager() 來安裝SM
(註)可以使用 "-Djava.security.policy"來指定不同的policy file路徑,
要注意的是 '='表示除了security porperties 指定的policies外, 也會load所指定的policy file; '=='則表示只load 所指定的policy file, 其他的都會被忽略.
在實作方面, SecurityManager事實上只是個control point, 真正的實作則是在AccessController裡頭:
public class SecurityManager{
...
public SecurityManager{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new RuntimePermission("createSecurityManager"));
}
...
public void checkPermission(Permission perm){
AccessController.checkPermission(perm);
}
...
...
}
(註) SecurityManager裡頭的checkXXX, 其實都是條用這個checkPermission
關於SecurityManager的範例可以參考這裡
最後就是doPrivileged(), 這是為了讓上層代碼執行不為AccessController允許的不可靠代碼, AccessController會允許使用該方法的使用者調用doPrivileged.
public SecureAction{
if (System.getSecurityManger() != null){
try{
String sprop1 = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("prop"));
String sprop2 = java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<String>(){
public String run(){return System.getProperty("prop");}
});
}catch (PrivilegedActionException e)
{}
}
}
Comments
Post a Comment